From c3296bc4529629ea9166e51a09459a942befdfa9 Mon Sep 17 00:00:00 2001 From: Braydenccc Date: Sun, 31 May 2026 01:38:44 +0800 Subject: [PATCH 1/5] =?UTF-8?q?refactor(PPTUIManager):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=B9=BB=E7=81=AF=E7=89=87=E6=94=BE=E6=98=A0=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91=E7=9C=8B=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=BF=E7=A8=8B=E5=AE=89=E5=85=A8=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=EF=BC=8C=E9=81=BF=E5=85=8D=E9=87=8D=E5=A4=8D=E8=B0=83?= =?UTF-8?q?=E7=94=A8UI=E7=BA=BF=E7=A8=8B=E8=B0=83=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/PPTUIManager.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Ink Canvas/Helpers/PPTUIManager.cs b/Ink Canvas/Helpers/PPTUIManager.cs index 8ba7ebd7..a7eddcb7 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(() => + _mainWindow.IsInPptPresentationMode = isInSlideShow; + + void UpdateSlideShowStatusOnUi() { try { 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.InvokeAsync(UpdateSlideShowStatusOnUi); + } } /// From 2763698520152231c08c06368b07b9523413e7b8 Mon Sep 17 00:00:00 2001 From: Braydenccc Date: Sun, 31 May 2026 02:03:15 +0800 Subject: [PATCH 2/5] =?UTF-8?q?fix(PPTUIManager):=20=E4=BF=AE=E5=A4=8DPPT?= =?UTF-8?q?=E6=94=BE=E6=98=A0=E7=8A=B6=E6=80=81=E6=9B=B4=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E5=AE=89=E5=85=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/PPTUIManager.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Ink Canvas/Helpers/PPTUIManager.cs b/Ink Canvas/Helpers/PPTUIManager.cs index a7eddcb7..67cb5904 100644 --- a/Ink Canvas/Helpers/PPTUIManager.cs +++ b/Ink Canvas/Helpers/PPTUIManager.cs @@ -76,12 +76,12 @@ public void UpdateConnectionStatus(bool isConnected) /// public void UpdateSlideShowStatus(bool isInSlideShow, int currentSlide = 0, int totalSlides = 0) { - _mainWindow.IsInPptPresentationMode = isInSlideShow; - void UpdateSlideShowStatusOnUi() { try { + _mainWindow.IsInPptPresentationMode = isInSlideShow; + if (isInSlideShow) { // Old UI removed: _mainWindow.BtnPPTSlideShow.Visibility = Visibility.Collapsed; @@ -150,7 +150,7 @@ void UpdateSlideShowStatusOnUi() } else { - _dispatcher.InvokeAsync(UpdateSlideShowStatusOnUi); + _dispatcher.Invoke(UpdateSlideShowStatusOnUi); } } From 2e886e793e336452736f0c35853cf04efb16df11 Mon Sep 17 00:00:00 2001 From: Braydenccc Date: Sun, 31 May 2026 02:30:03 +0800 Subject: [PATCH 3/5] =?UTF-8?q?fix:=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=EF=BC=9Appt=E5=A2=9E=E5=BC=BA=E9=A2=84=E8=A7=88=E4=BD=BF?= =?UTF-8?q?=E5=BE=97=E5=B7=A5=E5=85=B7=E6=A0=8F=E4=BD=8D=E7=A7=BB=EF=BC=8C?= =?UTF-8?q?ppt=E5=A2=9E=E5=BC=BA=E9=A2=84=E8=A7=88=E6=8D=A2=E9=A1=B5?= =?UTF-8?q?=E6=97=B6=E5=8A=A8=E7=94=BB=E9=97=AA=E7=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/ROTPPTManager.cs | 20 +++++++++++----- .../MainWindow_cs/MW_FloatingBarIcons.cs | 18 +++++++++----- Ink Canvas/MainWindow_cs/MW_PPT.cs | 24 ++++++++++++------- 3 files changed, 41 insertions(+), 21 deletions(-) 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..e7b2d7c5 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -2380,7 +2380,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 +2436,6 @@ private async Task OnPptNavBarPageClickAsync(Controls.PptNavBar bar) } } - if (!isFloatingBarFolded) - { - await Task.Delay(100); - ViewboxFloatingBarMarginAnimation(60); - } } catch (OperationCanceledException) { @@ -2451,11 +2446,22 @@ private async Task OnPptNavBarPageClickAsync(Controls.PptNavBar bar) } } - private void OnPptNavBarSlideSelected(Controls.PptNavBar bar, int slideNumber) + private async void OnPptNavBarSlideSelected(Controls.PptNavBar bar, int slideNumber) { - try { _pptManager?.TryNavigateToSlide(slideNumber); } + try + { + if (bar != null) + { + bar.IsPreviewExpanded = false; + bar.UpdateLayout(); + + // Give WPF one render pass to hide the preview before PowerPoint starts its transition. + await Dispatcher.InvokeAsync(() => { }, DispatcherPriority.Render); + } + + _pptManager?.TryNavigateToSlide(slideNumber); + } catch (Exception ex) { LogHelper.WriteLogToFile($"PPT增强预览跳转异常: {ex}", LogHelper.LogType.Error); } - finally { if (bar != null) bar.IsPreviewExpanded = false; } } /// From ec8d50216866fcfb0377c909dbc8e238fb08f33b Mon Sep 17 00:00:00 2001 From: Braydenccc Date: Sun, 31 May 2026 03:09:00 +0800 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20ppt=E6=94=BE=E6=98=A0=E6=97=B6?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E9=80=80=E5=87=BA=E6=94=BE=E6=98=A0=EF=BC=8C?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E6=A0=8F=E9=AB=98=E4=BA=AE=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E5=8F=98=E6=88=90=E4=BA=86=E9=BC=A0=E6=A0=87=E4=BD=86=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E4=B8=8A=E8=BF=98=E6=98=AF=E6=89=B9=E6=B3=A8=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_PPT.cs | 38 +++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index e7b2d7c5..6a41d8cb 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(); } @@ -3002,8 +2997,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) @@ -3029,6 +3023,7 @@ await Application.Current.Dispatcher.InvokeAsync(() => _pptUIManager?.UpdateSlideShowStatus(false); _pptUIManager?.UpdateSidebarExitButtons(false); HideFloatingBarExitPPTBtn(); + EnsureCursorModeAfterPptExit(); CheckMainWindowVisibility(); }); @@ -3071,6 +3066,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上一页控制按钮的鼠标按下事件 /// From e1f847a28eae7ebdb8ca3fda682f6d3f640289e6 Mon Sep 17 00:00:00 2001 From: Jbyccc Date: Sun, 31 May 2026 16:43:26 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=92=A4=E9=94=80=E5=85=B3=E4=BA=8E?= =?UTF-8?q?=E9=97=AA=E7=83=81=E7=9A=84=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_PPT.cs | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 6a41d8cb..f4c66f1c 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -2441,22 +2441,11 @@ private async Task OnPptNavBarPageClickAsync(Controls.PptNavBar bar) } } - private async void OnPptNavBarSlideSelected(Controls.PptNavBar bar, int slideNumber) + private void OnPptNavBarSlideSelected(Controls.PptNavBar bar, int slideNumber) { - try - { - if (bar != null) - { - bar.IsPreviewExpanded = false; - bar.UpdateLayout(); - - // Give WPF one render pass to hide the preview before PowerPoint starts its transition. - await Dispatcher.InvokeAsync(() => { }, DispatcherPriority.Render); - } - - _pptManager?.TryNavigateToSlide(slideNumber); - } + try { _pptManager?.TryNavigateToSlide(slideNumber); } catch (Exception ex) { LogHelper.WriteLogToFile($"PPT增强预览跳转异常: {ex}", LogHelper.LogType.Error); } + finally { if (bar != null) bar.IsPreviewExpanded = false; } } ///