fix:翻页控件不合理的显示时机

This commit is contained in:
2025-08-23 19:10:53 +08:00
parent 40eeb9db66
commit 44278d68b4
3 changed files with 101 additions and 1 deletions
+46
View File
@@ -25,6 +25,7 @@ namespace Ink_Canvas.Helpers
public event Action<Presentation> PresentationOpen;
public event Action<Presentation> PresentationClose;
public event Action<bool> PPTConnectionChanged;
public event Action<bool> SlideShowStateChanged;
#endregion
#region Properties
@@ -92,6 +93,7 @@ namespace Ink_Canvas.Helpers
#region Private Fields
private Timer _connectionCheckTimer;
private Timer _slideShowStateCheckTimer;
private Timer _wpsProcessCheckTimer;
private Process _wpsProcess;
private bool _hasWpsProcessId;
@@ -99,6 +101,7 @@ namespace Ink_Canvas.Helpers
private int _wpsProcessCheckCount;
private WpsWindowInfo _lastForegroundWpsWindow;
private DateTime _lastWindowCheckTime = DateTime.MinValue;
private bool _lastSlideShowState = false;
private readonly object _lockObject = new object();
private bool _disposed = false;
#endregion
@@ -114,6 +117,10 @@ namespace Ink_Canvas.Helpers
_connectionCheckTimer = new Timer(500);
_connectionCheckTimer.Elapsed += OnConnectionCheckTimerElapsed;
_connectionCheckTimer.AutoReset = true;
_slideShowStateCheckTimer = new Timer(1000);
_slideShowStateCheckTimer.Elapsed += OnSlideShowStateCheckTimerElapsed;
_slideShowStateCheckTimer.AutoReset = true;
}
public void StartMonitoring()
@@ -121,6 +128,7 @@ namespace Ink_Canvas.Helpers
if (!_disposed)
{
_connectionCheckTimer?.Start();
_slideShowStateCheckTimer?.Start();
LogHelper.WriteLogToFile("PPT监控已启动", LogHelper.LogType.Trace);
}
}
@@ -128,6 +136,7 @@ namespace Ink_Canvas.Helpers
public void StopMonitoring()
{
_connectionCheckTimer?.Stop();
_slideShowStateCheckTimer?.Stop();
DisconnectFromPPT();
LogHelper.WriteLogToFile("PPT监控已停止", LogHelper.LogType.Trace);
}
@@ -146,6 +155,18 @@ namespace Ink_Canvas.Helpers
}
}
private void OnSlideShowStateCheckTimerElapsed(object sender, ElapsedEventArgs e)
{
try
{
CheckSlideShowState();
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"PPT放映状态检查失败: {ex}", LogHelper.LogType.Error);
}
}
private void CheckAndConnectToPPT()
{
lock (_lockObject)
@@ -187,6 +208,30 @@ namespace Ink_Canvas.Helpers
}
}
private void CheckSlideShowState()
{
try
{
if (!IsConnected) return;
var currentSlideShowState = IsInSlideShow;
if (currentSlideShowState != _lastSlideShowState)
{
_lastSlideShowState = currentSlideShowState;
SlideShowStateChanged?.Invoke(currentSlideShowState);
if (!currentSlideShowState)
{
LogHelper.WriteLogToFile("检测到PPT放映已结束", LogHelper.LogType.Trace);
}
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"检查PPT放映状态异常: {ex}", LogHelper.LogType.Error);
}
}
private Microsoft.Office.Interop.PowerPoint.Application TryConnectToPowerPoint()
{
try
@@ -1627,6 +1672,7 @@ namespace Ink_Canvas.Helpers
StopWpsProcessCheckTimer();
_connectionCheckTimer?.Dispose();
_slideShowStateCheckTimer?.Dispose();
_wpsProcessCheckTimer?.Dispose();
_disposed = true;
+28 -1
View File
@@ -3,6 +3,7 @@ using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Threading;
using Ink_Canvas.Helpers;
namespace Ink_Canvas.Helpers
{
@@ -120,6 +121,29 @@ namespace Ink_Canvas.Helpers
});
}
/// <summary>
/// 处理PPT放映状态变化
/// </summary>
public void OnSlideShowStateChanged(bool isInSlideShow)
{
_dispatcher.InvokeAsync(() =>
{
try
{
if (!isInSlideShow)
{
// 如果不在放映模式,隐藏所有导航面板
HideAllNavigationPanels();
LogHelper.WriteLogToFile("PPT放映状态变化:隐藏导航面板", LogHelper.LogType.Trace);
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"处理PPT放映状态变化失败: {ex}", LogHelper.LogType.Error);
}
});
}
/// <summary>
/// 更新导航面板显示状态
/// </summary>
@@ -130,7 +154,10 @@ namespace Ink_Canvas.Helpers
try
{
// 检查是否应该显示PPT按钮
bool shouldShowButtons = ShowPPTButton && _mainWindow.BtnPPTSlideShowEnd.Visibility == Visibility.Visible;
// 不仅要检查按钮设置,还要确保确实在PPT放映模式下
bool shouldShowButtons = ShowPPTButton &&
_mainWindow.BtnPPTSlideShowEnd.Visibility == Visibility.Visible &&
_mainWindow.PPTManager?.IsInSlideShow == true;
if (!shouldShowButtons)
{
+27
View File
@@ -86,6 +86,11 @@ namespace Ink_Canvas
private PPTManager _pptManager;
private PPTInkManager _pptInkManager;
private PPTUIManager _pptUIManager;
/// <summary>
/// 获取PPT管理器实例(供UI管理器使用)
/// </summary>
public PPTManager PPTManager => _pptManager;
#endregion
#region PPT Manager Initialization
@@ -104,6 +109,7 @@ namespace Ink_Canvas
_pptManager.SlideShowEnd += OnPPTSlideShowEnd;
_pptManager.PresentationOpen += OnPPTPresentationOpen;
_pptManager.PresentationClose += OnPPTPresentationClose;
_pptManager.SlideShowStateChanged += OnPPTSlideShowStateChanged;
// 初始化墨迹管理器
_pptInkManager = new PPTInkManager();
@@ -242,6 +248,27 @@ namespace Ink_Canvas
}
}
private void OnPPTSlideShowStateChanged(bool isInSlideShow)
{
try
{
Application.Current.Dispatcher.InvokeAsync(() =>
{
// 通知UI管理器放映状态变化
_pptUIManager?.OnSlideShowStateChanged(isInSlideShow);
if (!isInSlideShow)
{
LogHelper.WriteLogToFile("PPT放映状态变化:退出放映模式", LogHelper.LogType.Trace);
}
});
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"处理PPT放映状态变化失败: {ex}", LogHelper.LogType.Error);
}
}
private async void OnPPTSlideShowBegin(SlideShowWindow wn)
{
try