diff --git a/Ink Canvas/Helpers/PPTUIManager.cs b/Ink Canvas/Helpers/PPTUIManager.cs index 8ba7ebd7..67cb5904 100644 --- a/Ink Canvas/Helpers/PPTUIManager.cs +++ b/Ink Canvas/Helpers/PPTUIManager.cs @@ -76,14 +76,15 @@ public void UpdateConnectionStatus(bool isConnected) /// public void UpdateSlideShowStatus(bool isInSlideShow, int currentSlide = 0, int totalSlides = 0) { - _dispatcher.InvokeAsync(() => + void UpdateSlideShowStatusOnUi() { try { + _mainWindow.IsInPptPresentationMode = isInSlideShow; + if (isInSlideShow) { // Old UI removed: _mainWindow.BtnPPTSlideShow.Visibility = Visibility.Collapsed; - _mainWindow.IsInPptPresentationMode = true; _mainWindow.UpdateToolbarComponentVisibility(); // 同步页码到所有翻页条 + 兼容旧绑定的隐藏 placeholder @@ -115,7 +116,6 @@ public void UpdateSlideShowStatus(bool isInSlideShow, int currentSlide = 0, int else { // Old UI removed: _mainWindow.BtnPPTSlideShow.Visibility = Visibility.Visible; - _mainWindow.IsInPptPresentationMode = false; _mainWindow.UpdateToolbarComponentVisibility(); HideAllNavigationPanels(); _mainWindow.UpdatePPTTimeCapsuleVisibility(); @@ -142,7 +142,16 @@ public void UpdateSlideShowStatus(bool isInSlideShow, int currentSlide = 0, int { LogHelper.WriteLogToFile($"更新幻灯片放映状态UI失败: {ex}", LogHelper.LogType.Error); } - }); + } + + if (_dispatcher.CheckAccess()) + { + UpdateSlideShowStatusOnUi(); + } + else + { + _dispatcher.Invoke(UpdateSlideShowStatusOnUi); + } } /// diff --git a/Ink Canvas/Helpers/ROTPPTManager.cs b/Ink Canvas/Helpers/ROTPPTManager.cs index 0028351d..7f981876 100644 --- a/Ink Canvas/Helpers/ROTPPTManager.cs +++ b/Ink Canvas/Helpers/ROTPPTManager.cs @@ -1706,6 +1706,7 @@ public object GetCurrentActivePresentation() object slide = null; object activeWindow = null; object presentation = null; + object returnedPresentation = null; try { if (!IsConnected || PPTApplication == null) return null; @@ -1745,7 +1746,8 @@ public object GetCurrentActivePresentation() { dynamic slideObj = slide; presentation = slideObj.Parent; - return presentation; + returnedPresentation = presentation; + return returnedPresentation; } } } @@ -1760,11 +1762,13 @@ public object GetCurrentActivePresentation() presentation = aw.Presentation; if (presentation != null) { - return presentation; + returnedPresentation = presentation; + return returnedPresentation; } } - return CurrentPresentation; + returnedPresentation = CurrentPresentation; + return returnedPresentation; } catch (COMException comEx) { @@ -1778,16 +1782,20 @@ public object GetCurrentActivePresentation() return null; } LogHelper.WriteLogToFile($"获取当前活跃演示文稿失败: {comEx.Message}", LogHelper.LogType.Warning); - return CurrentPresentation; + returnedPresentation = CurrentPresentation; + return returnedPresentation; } catch (Exception ex) { LogHelper.WriteLogToFile($"获取当前活跃演示文稿失败: {ex}", LogHelper.LogType.Error); - return CurrentPresentation; + returnedPresentation = CurrentPresentation; + return returnedPresentation; } finally { - if (presentation != null && !ReferenceEquals(presentation, CurrentPresentation)) + if (presentation != null && + !ReferenceEquals(presentation, CurrentPresentation) && + !ReferenceEquals(presentation, returnedPresentation)) { SafeReleaseComObject(presentation); } diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 553c3eb6..4c672bc4 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -3290,7 +3290,10 @@ private void RebuildCanvasOnTargetScreen(Screen targetScreen) /// /// 发送者 /// 路由事件参数 - internal async void CursorIcon_Click(object sender, MouseButtonEventArgs e) + internal void CursorIcon_Click(object sender, MouseButtonEventArgs e) + => CursorIcon_Click(sender, e, false); + + private async void CursorIcon_Click(object sender, MouseButtonEventArgs e, bool suppressFloatingBarMove) { if (lastBorderMouseDownObject is Panel panel) panel.Background = new SolidColorBrush(Colors.Transparent); @@ -3383,13 +3386,16 @@ internal async void CursorIcon_Click(object sender, MouseButtonEventArgs e) if (!isFloatingBarFolded) { - HideSubPanels("cursor", true); + HideSubPanels("cursor", !suppressFloatingBarMove); await Task.Delay(50); - if (IsInPptPresentationMode) - ViewboxFloatingBarMarginAnimation(60); - else - ViewboxFloatingBarMarginAnimation(100, true); + if (!suppressFloatingBarMove) + { + if (IsInPptPresentationMode) + ViewboxFloatingBarMarginAnimation(60); + else + ViewboxFloatingBarMarginAnimation(100, true); + } } } diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 8152e1a5..f4c66f1c 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -1597,12 +1597,7 @@ await Application.Current.Dispatcher.InvokeAsync(() => // 注意:快捷调色盘的可见性现在完全由工具栏规则集管理 // 不需要手动设置,UpdateToolbarComponentVisibility 会处理好 - if (GridTransparencyFakeBackground.Background != Brushes.Transparent) - BtnHideInkCanvas_Click(null, null); - SetCurrentToolMode(InkCanvasEditingMode.None); - - UpdateCurrentToolMode("cursor"); - SetFloatingBarHighlightPosition("cursor"); + EnsureCursorModeAfterPptExit(); CheckMainWindowVisibility(); } @@ -2380,7 +2375,7 @@ private async Task OnPptNavBarPageClickAsync(Controls.PptNavBar bar) GridTransparencyFakeBackground.Opacity = 1; GridTransparencyFakeBackground.Background = new SolidColorBrush(StringToColor("#01FFFFFF")); SetTransparentNotHitThrough(); - CursorIcon_Click(null, null); + CursorIcon_Click(null, null, true); if (Settings.PowerPointSettings.EnablePPTButtonEnhancedPreview && bar != null) { @@ -2436,11 +2431,6 @@ private async Task OnPptNavBarPageClickAsync(Controls.PptNavBar bar) } } - if (!isFloatingBarFolded) - { - await Task.Delay(100); - ViewboxFloatingBarMarginAnimation(60); - } } catch (OperationCanceledException) { @@ -2996,8 +2986,7 @@ await Application.Current.Dispatcher.InvokeAsync(() => await HandleManualSlideShowEnd(); } - HideSubPanels("cursor"); - SetCurrentToolMode(InkCanvasEditingMode.None); + await Application.Current.Dispatcher.InvokeAsync(EnsureCursorModeAfterPptExit); await Task.Delay(150); if (!isFloatingBarFolded) @@ -3023,6 +3012,7 @@ await Application.Current.Dispatcher.InvokeAsync(() => _pptUIManager?.UpdateSlideShowStatus(false); _pptUIManager?.UpdateSidebarExitButtons(false); HideFloatingBarExitPPTBtn(); + EnsureCursorModeAfterPptExit(); CheckMainWindowVisibility(); }); @@ -3065,6 +3055,33 @@ private async Task HandleManualSlideShowEnd() } } + private void EnsureCursorModeAfterPptExit() + { + try + { + GridTransparencyFakeBackground.Opacity = 0; + GridTransparencyFakeBackground.Background = Brushes.Transparent; + SetTransparentHitThrough(); + + GridBackgroundCoverHolder.Visibility = Visibility.Collapsed; + inkCanvas.IsHitTestVisible = false; + inkCanvas.Visibility = Visibility.Visible; + inkCanvas.Select(new StrokeCollection()); + GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed; + + RestoreFullScreenOnExitAnnotationMode(); + SetCurrentToolMode(InkCanvasEditingMode.None); + UpdateCurrentToolMode("cursor"); + UpdateToolbarComponentVisibility(); + HideSubPanels("cursor"); + SetFloatingBarHighlightPosition("cursor"); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"同步PPT退出后的鼠标模式失败: {ex}", LogHelper.LogType.Error); + } + } + /// /// 处理PPT上一页控制按钮的鼠标按下事件 ///