From 1b96c703860e7fcbbcc93cecd8bc7fdb097ad5c2 Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Thu, 18 Sep 2025 17:50:47 +0800 Subject: [PATCH 001/101] fix:issue #160 --- Ink Canvas/MainWindow_cs/MW_Timer.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_Timer.cs b/Ink Canvas/MainWindow_cs/MW_Timer.cs index 9ddcfd79..8bc6a035 100644 --- a/Ink Canvas/MainWindow_cs/MW_Timer.cs +++ b/Ink Canvas/MainWindow_cs/MW_Timer.cs @@ -1,4 +1,4 @@ -using Ink_Canvas.Helpers; +using Ink_Canvas.Helpers; using System; using System.ComponentModel; using System.Diagnostics; @@ -141,6 +141,7 @@ namespace Ink_Canvas { // NTP同步失败时,保持使用本地时间 cachedNetworkTime = DateTime.Now; + lastNtpSyncTime = DateTime.Now; } } @@ -164,16 +165,18 @@ namespace Ink_Canvas { // 网络时间获取失败时,使用本地时间 cachedNetworkTime = localTime; + lastNtpSyncTime = DateTime.Now; } } // 使用缓存的网络时间进行显示 - TimeSpan timeDifference = cachedNetworkTime - localTime; + DateTime dynamicNetworkTime = cachedNetworkTime + (localTime - lastNtpSyncTime); + TimeSpan timeDifference = dynamicNetworkTime - localTime; double timeDifferenceMinutes = Math.Abs(timeDifference.TotalMinutes); // 如果网络时间与本地时间相差不超过3分钟,则使用本地时间 - // 否则使用网络时间 - displayTime = timeDifferenceMinutes <= 3.0 ? localTime : cachedNetworkTime; + // 否则使用动态网络时间 + displayTime = timeDifferenceMinutes <= 3.0 ? localTime : dynamicNetworkTime; // 只更新时间,日期由原有逻辑定时更新即可 Dispatcher.Invoke(() => @@ -748,4 +751,4 @@ namespace Ink_Canvas } } } -} \ No newline at end of file +} From 71c77da898f8eeffb3d7523d6617632b934766a3 Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Thu, 18 Sep 2025 17:58:51 +0800 Subject: [PATCH 002/101] fix:issue #203 --- Ink Canvas/MainWindow_cs/MW_PPT.cs | 38 +++++++----------------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 16ea1892..366e0df3 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -1,4 +1,4 @@ -using Ink_Canvas.Helpers; +using Ink_Canvas.Helpers; using iNKORE.UI.WPF.Modern; using Microsoft.Office.Core; using Microsoft.Office.Interop.PowerPoint; @@ -622,10 +622,11 @@ namespace Ink_Canvas // 记录进入放映时浮动栏收纳状态 wasFloatingBarFoldedWhenEnterSlideShow = isFloatingBarFolded; - if (Settings.Automation.IsAutoFoldInPPTSlideShow && !isFloatingBarFolded) - FoldFloatingBar_MouseUp(new object(), null); - else if (isFloatingBarFolded) - await UnFoldFloatingBar(new object()); + if (Settings.Automation.IsAutoFoldInPPTSlideShow) + { + if (!isFloatingBarFolded) + FoldFloatingBar_MouseUp(new object(), null); + } isStopInkReplay = true; @@ -772,8 +773,8 @@ namespace Ink_Canvas { try { - // 处理浮动栏状态 - if (Settings.Automation.IsAutoFoldAfterPPTSlideShow && wasFloatingBarFoldedWhenEnterSlideShow) + // 处理浮动栏状态:严格按进入前的状态恢复 + if (wasFloatingBarFoldedWhenEnterSlideShow) { if (!isFloatingBarFolded) FoldFloatingBar_MouseUp(new object(), null); } @@ -1666,28 +1667,5 @@ namespace Ink_Canvas { BtnPPTSlideShowEnd_Click(BtnPPTSlideShowEnd, null); } - - - - - - - - - - - - - - - - - - - - - - - } } From eb91d2ce0adc2b70c412dae0ea2e46c7581ff9bb Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Thu, 18 Sep 2025 18:06:53 +0800 Subject: [PATCH 003/101] =?UTF-8?q?fix:=E7=99=BD=E6=9D=BF=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index dbb4c2ea..758f34c5 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -489,8 +489,8 @@ namespace Ink_Canvas } SystemEvents.DisplaySettingsChanged += SystemEventsOnDisplaySettingsChanged; - // 自动收纳到侧边栏 - if (Settings.Startup.IsFoldAtStartup) + // 自动收纳到侧边栏(若通过 --board 进入白板模式则跳过收纳) + if (Settings.Startup.IsFoldAtStartup && !App.StartWithBoardMode) { FoldFloatingBar_MouseUp(new object(), null); } From d1a1b17d291238c871f9cbd98e029fd036ccc4dc Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Thu, 18 Sep 2025 18:07:45 +0800 Subject: [PATCH 004/101] =?UTF-8?q?fix:=E7=99=BD=E6=9D=BF=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index 2518ab54..27ca8b51 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -1,4 +1,4 @@ -using Hardcodet.Wpf.TaskbarNotification; +using Hardcodet.Wpf.TaskbarNotification; using Ink_Canvas.Helpers; using Newtonsoft.Json; using OSVersionExtension; @@ -75,7 +75,7 @@ namespace Ink_Canvas Settings.Automation.AutoDelSavedFilesDaysThreshold); } - if (Settings.Startup.IsFoldAtStartup) + if (Settings.Startup.IsFoldAtStartup && !App.StartWithBoardMode) { FoldFloatingBar_MouseUp(Fold_Icon, null); } @@ -975,4 +975,4 @@ namespace Ink_Canvas } } } -} \ No newline at end of file +} From 313049f87399a2d1e305ac319576645f1f3e22be Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 11:08:52 +0800 Subject: [PATCH 005/101] fix:issue #203 --- Ink Canvas/Helpers/PPTUIManager.cs | 3 ++- Ink Canvas/MainWindow_cs/MW_AutoFold.cs | 4 +++- .../MainWindow_cs/MW_FloatingBarIcons.cs | 4 +++- ...vasForClass.csproj.AssemblyReference.cache | Bin 38181 -> 38044 bytes 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Ink Canvas/Helpers/PPTUIManager.cs b/Ink Canvas/Helpers/PPTUIManager.cs index fef41177..f1232ea8 100644 --- a/Ink Canvas/Helpers/PPTUIManager.cs +++ b/Ink Canvas/Helpers/PPTUIManager.cs @@ -182,7 +182,8 @@ namespace Ink_Canvas.Helpers bool shouldShowButtons = ShowPPTButton && _mainWindow.BtnPPTSlideShowEnd.Visibility == Visibility.Visible && isInSlideShow && - hasValidPageCount; + hasValidPageCount && + !Settings.Automation.IsAutoFoldInPPTSlideShow; if (!shouldShowButtons) { diff --git a/Ink Canvas/MainWindow_cs/MW_AutoFold.cs b/Ink Canvas/MainWindow_cs/MW_AutoFold.cs index 8e8d34b7..a26e6b06 100644 --- a/Ink Canvas/MainWindow_cs/MW_AutoFold.cs +++ b/Ink Canvas/MainWindow_cs/MW_AutoFold.cs @@ -260,10 +260,12 @@ namespace Ink_Canvas } // 只有在PPT放映模式下且页数有效时才显示翻页按钮 + // 但是,如果启用了PPT自动收纳功能,则不显示翻页按钮 if (StackPanelPPTControls.Visibility == Visibility.Visible && BtnPPTSlideShowEnd.Visibility == Visibility.Visible && PPTManager?.IsInSlideShow == true && - PPTManager?.SlidesCount > 0) + PPTManager?.SlidesCount > 0 && + !Settings.Automation.IsAutoFoldInPPTSlideShow) { var dops = Settings.PowerPointSettings.PPTButtonsDisplayOption.ToString(); var dopsc = dops.ToCharArray(); diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 21263020..e15938e4 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -684,10 +684,12 @@ namespace Ink_Canvas HideSubPanelsImmediately(); // 只有在PPT放映模式下且页数有效时才显示翻页按钮 + // 但是,如果启用了PPT自动收纳功能,则不显示翻页按钮 if (StackPanelPPTControls.Visibility == Visibility.Visible && BtnPPTSlideShowEnd.Visibility == Visibility.Visible && PPTManager?.IsInSlideShow == true && - PPTManager?.SlidesCount > 0) + PPTManager?.SlidesCount > 0 && + !Settings.Automation.IsAutoFoldInPPTSlideShow) { var dops = Settings.PowerPointSettings.PPTButtonsDisplayOption.ToString(); var dopsc = dops.ToCharArray(); diff --git a/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.AssemblyReference.cache b/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.AssemblyReference.cache index 57d842b8b7d92d5308ee26301638a87ff9085d80..c8c2dfbd497b829755ee6211820ad2e2d43c9d13 100644 GIT binary patch delta 23 fcmZ3wifPVDCJr`6Lk0#0#>B~nPN5rP?WX_$OSlGi delta 70 zcmbQUl4B~nPN5rP?War*kO`k`FUd8TkDE=&SuZ6ghmjGefZ>7T XjqeIqIY4T;%1rbO^o$LR4J{b}mk1Gb From ba0629000e27a673bc46e7de54a20d77f031e934 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 11:22:09 +0800 Subject: [PATCH 006/101] =?UTF-8?q?add:=E9=80=80=E5=87=BA=E7=99=BD?= =?UTF-8?q?=E6=9D=BF=E6=94=B6=E7=BA=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/PPTUIManager.cs | 2 +- Ink Canvas/MainWindow.xaml | 9 +++++++++ .../MainWindow_cs/MW_FloatingBarIcons.cs | 6 ++++++ Ink Canvas/MainWindow_cs/MW_PPT.cs | 3 +++ Ink Canvas/MainWindow_cs/MW_Settings.cs | 7 +++++++ Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs | 3 +++ Ink Canvas/Resources/Settings.cs | 3 +++ ...vasForClass.csproj.AssemblyReference.cache | Bin 38044 -> 38181 bytes 8 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Ink Canvas/Helpers/PPTUIManager.cs b/Ink Canvas/Helpers/PPTUIManager.cs index f1232ea8..f7646bbd 100644 --- a/Ink Canvas/Helpers/PPTUIManager.cs +++ b/Ink Canvas/Helpers/PPTUIManager.cs @@ -183,7 +183,7 @@ namespace Ink_Canvas.Helpers _mainWindow.BtnPPTSlideShowEnd.Visibility == Visibility.Visible && isInSlideShow && hasValidPageCount && - !Settings.Automation.IsAutoFoldInPPTSlideShow; + !MainWindow.Settings.Automation.IsAutoFoldInPPTSlideShow; if (!shouldShowButtons) { diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 187411e7..58f62b04 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -3098,6 +3098,15 @@ Toggled="ToggleSwitchAutoFoldAfterPPTSlideShow_Toggled" /> + + + + + diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index e15938e4..2fbcf730 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -2808,6 +2808,12 @@ namespace Ink_Canvas // 新增:在屏幕模式下恢复基础浮动栏的显示 ViewboxFloatingBar.Visibility = Visibility.Visible; + // 新增:退出白板时自动收纳功能 + if (Settings.Automation.IsAutoFoldWhenExitWhiteboard && !isFloatingBarFolded) + { + FoldFloatingBar_MouseUp(null, null); + } + if (BtnSwitchTheme.Content.ToString() == "浅色") { BtnSwitch.Content = "黑板"; diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 366e0df3..94370fc5 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -700,6 +700,9 @@ namespace Ink_Canvas if (Settings.PowerPointSettings.IsShowCanvasAtNewSlideShow && !Settings.Automation.IsAutoFoldInPPTSlideShow) { + // 先进入批注模式,这会显示调色盘 + PenIcon_Click(null, null); + // 然后设置颜色 BtnColorRed_Click(null, null); Dispatcher.BeginInvoke(new Action(() => { diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index fee71d5f..0d488220 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -1543,6 +1543,13 @@ namespace Ink_Canvas SaveSettingsToFile(); } + private void ToggleSwitchAutoFoldWhenExitWhiteboard_Toggled(object sender, RoutedEventArgs e) + { + if (!isLoaded) return; + Settings.Automation.IsAutoFoldWhenExitWhiteboard = ToggleSwitchAutoFoldWhenExitWhiteboard.IsOn; + SaveSettingsToFile(); + } + private void ToggleSwitchSaveScreenshotsInDateFolders_Toggled(object sender, RoutedEventArgs e) { if (!isLoaded) return; diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index 27ca8b51..b2e29494 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -907,6 +907,9 @@ namespace Ink_Canvas // 加载退出收纳模式自动切换至批注模式设置 ToggleSwitchAutoEnterAnnotationModeWhenExitFoldMode.IsOn = Settings.Automation.IsAutoEnterAnnotationModeWhenExitFoldMode; + + // 加载退出白板时自动收纳设置 + ToggleSwitchAutoFoldWhenExitWhiteboard.IsOn = Settings.Automation.IsAutoFoldWhenExitWhiteboard; } else { diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs index d1997e4e..5e758505 100644 --- a/Ink Canvas/Resources/Settings.cs +++ b/Ink Canvas/Resources/Settings.cs @@ -339,6 +339,9 @@ namespace Ink_Canvas [JsonProperty("isAutoEnterAnnotationModeWhenExitFoldMode")] public bool IsAutoEnterAnnotationModeWhenExitFoldMode { get; set; } + [JsonProperty("isAutoFoldWhenExitWhiteboard")] + public bool IsAutoFoldWhenExitWhiteboard { get; set; } + [JsonProperty("isAutoFoldInEasiNote")] public bool IsAutoFoldInEasiNote { get; set; } diff --git a/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.AssemblyReference.cache b/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.AssemblyReference.cache index c8c2dfbd497b829755ee6211820ad2e2d43c9d13..57d842b8b7d92d5308ee26301638a87ff9085d80 100644 GIT binary patch delta 70 zcmbQUl4B~nPN5rP?War*kO`k`FUd8TkDE=&SuZ6ghmjGefZ>7T XjqeIqIY4T;%1rbO^o$LR4J{b}mk1Gb delta 23 fcmZ3wifPVDCJr`6Lk0#0#>B~nPN5rP?WX_$OSlGi From 2ee93bbcc195846292a3cbb1fcb8f44305ac09fe Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 11:42:33 +0800 Subject: [PATCH 007/101] fix:issue #209 --- .../MainWindow_cs/MW_ElementsControls.cs | 84 +++++++++++++++++++ .../MainWindow_cs/MW_SelectionGestures.cs | 44 ++++------ 2 files changed, 98 insertions(+), 30 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs index 0daf4189..dae0a343 100644 --- a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs +++ b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs @@ -1334,6 +1334,90 @@ namespace Ink_Canvas } } + /// + /// 克隆墨迹集合 + /// + /// 要克隆的墨迹集合 + /// 克隆后的墨迹集合 + private StrokeCollection CloneStrokes(StrokeCollection strokes) + { + if (strokes == null || strokes.Count == 0) return new StrokeCollection(); + + try + { + // 创建墨迹集合的副本 + var clonedStrokes = strokes.Clone(); + + // 为每个墨迹添加位置偏移以避免重叠 + foreach (var stroke in clonedStrokes) + { + var offsetPoints = new StylusPointCollection(); + foreach (var point in stroke.StylusPoints) + { + offsetPoints.Add(new StylusPoint(point.X + 20, point.Y + 20, point.PressureFactor)); + } + stroke.StylusPoints = offsetPoints; + } + + // 添加到画布 + inkCanvas.Strokes.Add(clonedStrokes); + + // 提交到时间机器以支持撤销 + timeMachine.CommitStrokeUserInputHistory(clonedStrokes); + + LogHelper.WriteLogToFile($"墨迹克隆完成: {clonedStrokes.Count} 个墨迹"); + return clonedStrokes; + } + catch (Exception ex) + { + // 记录错误但不中断程序 + LogHelper.WriteLogToFile($"克隆墨迹时发生错误: {ex.Message}", LogHelper.LogType.Error); + return new StrokeCollection(); + } + } + + /// + /// 克隆墨迹集合到新页面 + /// + /// 要克隆的墨迹集合 + private void CloneStrokesToNewBoard(StrokeCollection strokes) + { + if (strokes == null || strokes.Count == 0) return; + + try + { + // 创建墨迹集合的副本 + var clonedStrokes = strokes.Clone(); + + // 为每个墨迹添加位置偏移以避免重叠 + foreach (var stroke in clonedStrokes) + { + var offsetPoints = new StylusPointCollection(); + foreach (var point in stroke.StylusPoints) + { + offsetPoints.Add(new StylusPoint(point.X + 20, point.Y + 20, point.PressureFactor)); + } + stroke.StylusPoints = offsetPoints; + } + + // 创建新页面 + BtnWhiteBoardAdd_Click(null, null); + + // 添加到新页面的画布 + inkCanvas.Strokes.Add(clonedStrokes); + + // 提交到时间机器以支持撤销 + timeMachine.CommitStrokeUserInputHistory(clonedStrokes); + + LogHelper.WriteLogToFile($"墨迹克隆到新页面完成: {clonedStrokes.Count} 个墨迹"); + } + catch (Exception ex) + { + // 记录错误但不中断程序 + LogHelper.WriteLogToFile($"克隆墨迹到新页面时发生错误: {ex.Message}", LogHelper.LogType.Error); + } + } + #endregion } } diff --git a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs index 71981cd6..892527ad 100644 --- a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs +++ b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs @@ -34,23 +34,24 @@ namespace Ink_Canvas lastBorderMouseDownObject = sender; } - private bool isStrokeSelectionCloneOn; private void BorderStrokeSelectionClone_MouseUp(object sender, MouseButtonEventArgs e) { if (lastBorderMouseDownObject != sender) return; - if (isStrokeSelectionCloneOn) + try { - BorderStrokeSelectionClone.Background = Brushes.Transparent; - - isStrokeSelectionCloneOn = false; + var strokes = inkCanvas.GetSelectedStrokes(); + if (strokes.Count > 0) + { + // 直接执行克隆操作,与图片克隆保持一致 + CloneStrokes(strokes); + LogHelper.WriteLogToFile($"墨迹克隆完成: {strokes.Count} 个墨迹"); + } } - else + catch (Exception ex) { - BorderStrokeSelectionClone.Background = new SolidColorBrush(StringToColor("#FF1ED760")); - - isStrokeSelectionCloneOn = true; + LogHelper.WriteLogToFile($"墨迹克隆失败: {ex.Message}", LogHelper.LogType.Error); } } @@ -60,9 +61,7 @@ namespace Ink_Canvas var strokes = inkCanvas.GetSelectedStrokes(); inkCanvas.Select(new StrokeCollection()); - strokes = strokes.Clone(); - BtnWhiteBoardAdd_Click(null, null); - inkCanvas.Strokes.Add(strokes); + CloneStrokesToNewBoard(strokes); } private void BorderStrokeSelectionDelete_MouseUp(object sender, MouseButtonEventArgs e) @@ -408,7 +407,6 @@ namespace Ink_Canvas // 显示墨迹选择栏和选择框 GridInkCanvasSelectionCover.Visibility = Visibility.Visible; BorderStrokeSelectionClone.Background = Brushes.Transparent; - isStrokeSelectionCloneOn = false; updateBorderStrokeSelectionControlLocation(); UpdateSelectionDisplay(); return; @@ -657,23 +655,9 @@ namespace Ink_Canvas } } - if (isStrokeSelectionCloneOn) - { - var strokes = inkCanvas.GetSelectedStrokes(); - isProgramChangeStrokeSelection = true; - inkCanvas.Select(new StrokeCollection()); - StrokesSelectionClone = strokes.Clone(); - inkCanvas.Select(strokes); - isProgramChangeStrokeSelection = false; - inkCanvas.Strokes.Add(StrokesSelectionClone); - } - else - { - // 新增:启动套索选择模式 - // 使用集中化的工具模式切换方法 - SetCurrentToolMode(InkCanvasEditingMode.Select); - inkCanvas.Select(new StrokeCollection()); - } + + SetCurrentToolMode(InkCanvasEditingMode.Select); + inkCanvas.Select(new StrokeCollection()); } } From 176f1cf405112cc55d0d873d64a534f90abb6cce Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 11:45:35 +0800 Subject: [PATCH 008/101] fix:issue #208 --- Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index 0f9a5dd6..33834fdc 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -1042,13 +1042,6 @@ namespace Ink_Canvas break; } - if (!Settings.Gesture.IsEnableTwoFingerZoom) continue; - try - { - stroke.DrawingAttributes.Width *= md.Scale.X; - stroke.DrawingAttributes.Height *= md.Scale.Y; - } - catch { } } } else From ea7d0bbf712cba58810e0dd44c7c13fc31b3db16 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 11:49:25 +0800 Subject: [PATCH 009/101] fix:issue #206 --- Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs index 70e4b8cc..357afd2a 100644 --- a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs +++ b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs @@ -344,7 +344,7 @@ namespace Ink_Canvas await CheckIsDrawingShapesInMultiTouchMode(); EnterShapeDrawingMode(3); CancelSingleFingerDragMode(); - isLongPressSelected = true; // 设置为选中状态,避免抬笔后切换回笔模式 + isLongPressSelected = false; lastMouseDownSender = null; DrawShapePromptToPen(); } From 17f137af0983f858e22df8708af5dad3e27f53be Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 11:55:50 +0800 Subject: [PATCH 010/101] fix:issue #210 --- .../MainWindow_cs/MW_FloatingBarIcons.cs | 40 ++++++++++-- Ink Canvas/MainWindow_cs/MW_Settings.cs | 62 +++++++++++++++++++ Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs | 36 ++++++++++- 3 files changed, 133 insertions(+), 5 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 2fbcf730..2c0c8c30 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -91,6 +91,9 @@ namespace Ink_Canvas BoardGesture.BorderBrush = new SolidColorBrush(Color.FromRgb(161, 161, 170)); BoardGestureGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.DisabledGestureIcon); BoardGestureGeometry2.Geometry = Geometry.Parse("F0 M24,24z M0,0z"); + + // 强制禁用所有双指手势功能 + ForceDisableTwoFingerGestures(); } else { @@ -1887,8 +1890,6 @@ namespace Ink_Canvas // 禁用高级橡皮擦系统 DisableAdvancedEraserSystem(); - // 修复:从橡皮擦切换到批注模式时,退出多指书写模式 - // 这解决了从橡皮擦切换为批注时被锁定为多指书写的问题 ExitMultiTouchModeIfNeeded(); SetFloatingBarHighlightPosition("pen"); @@ -1897,14 +1898,20 @@ namespace Ink_Canvas bool wasInInkMode = inkCanvas.EditingMode == InkCanvasEditingMode.Ink; bool wasHighlighter = drawingAttributes.IsHighlighter; - // 禁止几何绘制模式下切换到Ink - if (drawingShapeMode != 0) + if (drawingShapeMode != 0 && !isLongPressSelected) { return; } if (Pen_Icon.Background == null || StackPanelCanvasControls.Visibility == Visibility.Collapsed) { + if (isLongPressSelected) + { + drawingShapeMode = 0; + isLongPressSelected = false; + ResetAllShapeButtonsOpacity(); + } + // 使用集中化的工具模式切换方法 SetCurrentToolMode(InkCanvasEditingMode.Ink); @@ -3724,7 +3731,32 @@ namespace Ink_Canvas } } + /// + /// 强制禁用所有双指手势功能(当多指书写模式启用时) + /// + private void ForceDisableTwoFingerGestures() + { + // 强制关闭所有双指手势设置 + Settings.Gesture.IsEnableTwoFingerTranslate = false; + Settings.Gesture.IsEnableTwoFingerZoom = false; + Settings.Gesture.IsEnableTwoFingerRotation = false; + // 更新UI开关状态 + if (ToggleSwitchEnableTwoFingerTranslate != null) + ToggleSwitchEnableTwoFingerTranslate.IsOn = false; + if (ToggleSwitchEnableTwoFingerZoom != null) + ToggleSwitchEnableTwoFingerZoom.IsOn = false; + if (ToggleSwitchEnableTwoFingerRotation != null) + ToggleSwitchEnableTwoFingerRotation.IsOn = false; + + // 更新设置窗口中的开关状态 + if (BoardToggleSwitchEnableTwoFingerTranslate != null) + BoardToggleSwitchEnableTwoFingerTranslate.IsOn = false; + if (BoardToggleSwitchEnableTwoFingerZoom != null) + BoardToggleSwitchEnableTwoFingerZoom.IsOn = false; + if (BoardToggleSwitchEnableTwoFingerRotation != null) + BoardToggleSwitchEnableTwoFingerRotation.IsOn = false; + } #endregion diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index 0d488220..7bbf2d4d 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -1787,6 +1787,18 @@ namespace Ink_Canvas private void ToggleSwitchEnableTwoFingerZoom_Toggled(object sender, RoutedEventArgs e) { if (!isLoaded) return; + + // 如果多指书写模式启用,强制禁用双指手势 + if (ToggleSwitchEnableMultiTouchMode.IsOn) + { + ToggleSwitchEnableTwoFingerZoom.IsOn = false; + BoardToggleSwitchEnableTwoFingerZoom.IsOn = false; + Settings.Gesture.IsEnableTwoFingerZoom = false; + CheckEnableTwoFingerGestureBtnColorPrompt(); + SaveSettingsToFile(); + return; + } + if (sender == ToggleSwitchEnableTwoFingerZoom) BoardToggleSwitchEnableTwoFingerZoom.IsOn = ToggleSwitchEnableTwoFingerZoom.IsOn; else @@ -1866,6 +1878,32 @@ namespace Ink_Canvas } Settings.Gesture.IsEnableMultiTouchMode = ToggleSwitchEnableMultiTouchMode.IsOn; + + // 如果启用多指书写模式,强制禁用所有双指手势 + if (ToggleSwitchEnableMultiTouchMode.IsOn) + { + // 强制关闭所有双指手势设置 + Settings.Gesture.IsEnableTwoFingerTranslate = false; + Settings.Gesture.IsEnableTwoFingerZoom = false; + Settings.Gesture.IsEnableTwoFingerRotation = false; + + // 更新UI开关状态 + if (ToggleSwitchEnableTwoFingerTranslate != null) + ToggleSwitchEnableTwoFingerTranslate.IsOn = false; + if (ToggleSwitchEnableTwoFingerZoom != null) + ToggleSwitchEnableTwoFingerZoom.IsOn = false; + if (ToggleSwitchEnableTwoFingerRotation != null) + ToggleSwitchEnableTwoFingerRotation.IsOn = false; + + // 更新设置窗口中的开关状态 + if (BoardToggleSwitchEnableTwoFingerTranslate != null) + BoardToggleSwitchEnableTwoFingerTranslate.IsOn = false; + if (BoardToggleSwitchEnableTwoFingerZoom != null) + BoardToggleSwitchEnableTwoFingerZoom.IsOn = false; + if (BoardToggleSwitchEnableTwoFingerRotation != null) + BoardToggleSwitchEnableTwoFingerRotation.IsOn = false; + } + CheckEnableTwoFingerGestureBtnColorPrompt(); SaveSettingsToFile(); } @@ -1873,6 +1911,18 @@ namespace Ink_Canvas private void ToggleSwitchEnableTwoFingerTranslate_Toggled(object sender, RoutedEventArgs e) { if (!isLoaded) return; + + // 如果多指书写模式启用,强制禁用双指手势 + if (ToggleSwitchEnableMultiTouchMode.IsOn) + { + ToggleSwitchEnableTwoFingerTranslate.IsOn = false; + BoardToggleSwitchEnableTwoFingerTranslate.IsOn = false; + Settings.Gesture.IsEnableTwoFingerTranslate = false; + CheckEnableTwoFingerGestureBtnColorPrompt(); + SaveSettingsToFile(); + return; + } + if (sender == ToggleSwitchEnableTwoFingerTranslate) BoardToggleSwitchEnableTwoFingerTranslate.IsOn = ToggleSwitchEnableTwoFingerTranslate.IsOn; else @@ -1886,6 +1936,17 @@ namespace Ink_Canvas { if (!isLoaded) return; + // 如果多指书写模式启用,强制禁用双指手势 + if (ToggleSwitchEnableMultiTouchMode.IsOn) + { + ToggleSwitchEnableTwoFingerRotation.IsOn = false; + BoardToggleSwitchEnableTwoFingerRotation.IsOn = false; + Settings.Gesture.IsEnableTwoFingerRotation = false; + CheckEnableTwoFingerGestureBtnColorPrompt(); + SaveSettingsToFile(); + return; + } + if (sender == ToggleSwitchEnableTwoFingerRotation) BoardToggleSwitchEnableTwoFingerRotation.IsOn = ToggleSwitchEnableTwoFingerRotation.IsOn; else @@ -1904,6 +1965,7 @@ namespace Ink_Canvas SaveSettingsToFile(); } + #endregion #region Reset diff --git a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs index 357afd2a..f3b0c256 100644 --- a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs +++ b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs @@ -151,10 +151,12 @@ namespace Ink_Canvas } inkCanvas.EditingMode = InkCanvasEditingMode.Ink; - // 修复:确保从橡皮擦切换到笔时,多指手势功能能正确恢复 + // 更新lastInkCanvasEditingMode以确保多指手势逻辑正确 lastInkCanvasEditingMode = InkCanvasEditingMode.Ink; + ResetAllShapeButtonsOpacity(); + SetCursorBasedOnEditingMode(inkCanvas); } @@ -1987,6 +1989,38 @@ namespace Ink_Canvas drawingShapeMode = mode; inkCanvas.EditingMode = InkCanvasEditingMode.None; SetCursorBasedOnEditingMode(inkCanvas); + ResetAllShapeButtonsOpacity(); + } + + /// + /// 重置所有几何绘制按钮的透明度状态 + /// + private void ResetAllShapeButtonsOpacity() + { + try + { + // 重置所有几何绘制按钮的透明度为1(完全不透明) + var buttons = new UIElement[] { + ImageDrawLine, BoardImageDrawLine, + ImageDrawDashedLine, BoardImageDrawDashedLine, + ImageDrawDotLine, BoardImageDrawDotLine, + ImageDrawArrow, BoardImageDrawArrow, + ImageDrawParallelLine, BoardImageDrawParallelLine, + }; + + foreach (var button in buttons) + { + if (button != null) + { + var dA = new DoubleAnimation(1, 1, new Duration(TimeSpan.FromMilliseconds(0))); + button.BeginAnimation(OpacityProperty, dA); + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"重置几何绘制按钮透明度失败: {ex.Message}", LogHelper.LogType.Error); + } } /// From a9cc94ccb6255f50c348310fd25bd620760f22bf Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 12:03:30 +0800 Subject: [PATCH 011/101] fix:issue #210 --- Ink Canvas/MainWindow_cs/MW_BoardControls.cs | 18 ++++-- .../MainWindow_cs/MW_FloatingBarIcons.cs | 60 +++++++++++++++++++ Ink Canvas/MainWindow_cs/MW_PageListView.cs | 13 +++- Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 6 ++ 4 files changed, 90 insertions(+), 7 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_BoardControls.cs b/Ink Canvas/MainWindow_cs/MW_BoardControls.cs index 934c7e25..07b8d8bc 100644 --- a/Ink Canvas/MainWindow_cs/MW_BoardControls.cs +++ b/Ink Canvas/MainWindow_cs/MW_BoardControls.cs @@ -191,9 +191,12 @@ namespace Ink_Canvas RefreshBlackBoardSidePageListView(); AnimationsHelper.ShowWithSlideFromBottomAndFade(BoardBorderLeftPageListView); await Task.Delay(1); - ScrollViewToVerticalTop( - (ListViewItem)BlackBoardLeftSidePageListView.ItemContainerGenerator.ContainerFromIndex( - CurrentWhiteboardIndex - 1), BlackBoardLeftSidePageListScrollViewer); + var leftContainer = BlackBoardLeftSidePageListView.ItemContainerGenerator.ContainerFromIndex( + CurrentWhiteboardIndex - 1) as ListViewItem; + if (leftContainer != null) + { + ScrollViewToVerticalTop(leftContainer, BlackBoardLeftSidePageListScrollViewer); + } } } else if (sender == BtnRightPageListWB) @@ -208,9 +211,12 @@ namespace Ink_Canvas RefreshBlackBoardSidePageListView(); AnimationsHelper.ShowWithSlideFromBottomAndFade(BoardBorderRightPageListView); await Task.Delay(1); - ScrollViewToVerticalTop( - (ListViewItem)BlackBoardRightSidePageListView.ItemContainerGenerator.ContainerFromIndex( - CurrentWhiteboardIndex - 1), BlackBoardRightSidePageListScrollViewer); + var rightContainer = BlackBoardRightSidePageListView.ItemContainerGenerator.ContainerFromIndex( + CurrentWhiteboardIndex - 1) as ListViewItem; + if (rightContainer != null) + { + ScrollViewToVerticalTop(rightContainer, BlackBoardRightSidePageListScrollViewer); + } } } diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 2c0c8c30..44495fc7 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -2134,6 +2134,11 @@ namespace Ink_Canvas SaveStrokes(); } + if (!isAlreadyEraser) + { + ResetTouchStates(); + } + // 启用新的高级橡皮擦系统 EnableAdvancedEraserSystem(); @@ -2732,6 +2737,61 @@ namespace Ink_Canvas if (isSingleFingerDragMode) BtnFingerDragMode_Click(BtnFingerDragMode, null); isLongPressSelected = false; + + ResetTouchStates(); + } + + /// + /// 重置所有触摸相关状态, + /// + private void ResetTouchStates() + { + try + { + // 清空触摸点计数器 + dec.Clear(); + + // 重置多指触摸模式状态 + if (isInMultiTouchMode) + { + isInMultiTouchMode = false; + } + + // 重置单指拖动模式状态 + if (isSingleFingerDragMode) + { + isSingleFingerDragMode = false; + if (BtnFingerDragMode != null) + { + BtnFingerDragMode.Content = "单指\n拖动"; + } + } + + // 重置手掌擦状态 + if (isPalmEraserActive) + { + isPalmEraserActive = false; + palmEraserTouchDownHandled = false; + palmEraserTouchIds.Clear(); + StopPalmEraserRecoveryTimer(); + } + + // 确保触摸事件能正常响应 + inkCanvas.IsHitTestVisible = true; + inkCanvas.IsManipulationEnabled = true; + + // 释放所有触摸捕获 + inkCanvas.ReleaseAllTouchCaptures(); + + // 恢复UI元素的触摸响应 + ViewboxFloatingBar.IsHitTestVisible = true; + BlackboardUIGridForInkReplay.IsHitTestVisible = true; + + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"重置触摸状态失败: {ex.Message}", LogHelper.LogType.Error); + } } private void BtnHideControl_Click(object sender, RoutedEventArgs e) diff --git a/Ink Canvas/MainWindow_cs/MW_PageListView.cs b/Ink Canvas/MainWindow_cs/MW_PageListView.cs index 27d0e8e7..395d0058 100644 --- a/Ink Canvas/MainWindow_cs/MW_PageListView.cs +++ b/Ink Canvas/MainWindow_cs/MW_PageListView.cs @@ -68,9 +68,20 @@ namespace Ink_Canvas public static void ScrollViewToVerticalTop(FrameworkElement element, ScrollViewer scrollViewer) { + if (element == null || scrollViewer == null) + { + return; + } + var scrollViewerOffset = scrollViewer.VerticalOffset; var point = new Point(0, scrollViewerOffset); - var tarPos = element.TransformToVisual(scrollViewer).Transform(point); + var transform = element.TransformToVisual(scrollViewer); + if (transform == null) + { + return; + } + + var tarPos = transform.Transform(point); scrollViewer.ScrollToVerticalOffset(tarPos.Y); } diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index 33834fdc..d33e4db6 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -968,6 +968,12 @@ namespace Ink_Canvas // 修复:允许单指拖动选中的墨迹,即使禁用了多指手势 if (isInMultiTouchMode) return; + + if (dec.Count == 0 && (isSingleFingerDragMode || isInMultiTouchMode)) + { + ResetTouchStates(); + return; + } // 如果是单指拖动选中的墨迹,允许处理 if (dec.Count == 1 && inkCanvas.GetSelectedStrokes().Count > 0) From cd90490b8d9095f0f2c2b3a53f37838645c5d607 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 12:15:21 +0800 Subject: [PATCH 012/101] fix:issue #210 --- Ink Canvas/MainWindow_cs/MW_BoardControls.cs | 51 ++++++++++++++++++- .../MainWindow_cs/MW_FloatingBarIcons.cs | 7 +-- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_BoardControls.cs b/Ink Canvas/MainWindow_cs/MW_BoardControls.cs index 07b8d8bc..e4262503 100644 --- a/Ink Canvas/MainWindow_cs/MW_BoardControls.cs +++ b/Ink Canvas/MainWindow_cs/MW_BoardControls.cs @@ -15,10 +15,10 @@ namespace Ink_Canvas private StrokeCollection[] strokeCollections = new StrokeCollection[101]; private bool[] whiteboadLastModeIsRedo = new bool[101]; private StrokeCollection lastTouchDownStrokeCollection = new StrokeCollection(); - private int CurrentWhiteboardIndex = 1; private int WhiteboardTotalCount = 1; - private TimeMachineHistory[][] TimeMachineHistories = new TimeMachineHistory[101][]; //最多99页,0用来存储非白板时的墨迹以便还原 + private TimeMachineHistory[][] TimeMachineHistories = new TimeMachineHistory[101][]; + private bool[] savedMultiTouchModeStates = new bool[101]; // 保存每页白板图片信息 private void SaveStrokes(bool isBackupMain = false) @@ -97,6 +97,8 @@ namespace Ink_Canvas { var timeMachineHistory = timeMachine.ExportTimeMachineHistory(); TimeMachineHistories[0] = timeMachineHistory; + // 保存多指书写模式状态 + savedMultiTouchModeStates[0] = isInMultiTouchMode; timeMachine.ClearStrokeHistory(); @@ -105,6 +107,8 @@ namespace Ink_Canvas { var timeMachineHistory = timeMachine.ExportTimeMachineHistory(); TimeMachineHistories[CurrentWhiteboardIndex] = timeMachineHistory; + // 保存多指书写模式状态 + savedMultiTouchModeStates[CurrentWhiteboardIndex] = isInMultiTouchMode; timeMachine.ClearStrokeHistory(); @@ -161,12 +165,16 @@ namespace Ink_Canvas { timeMachine.ImportTimeMachineHistory(TimeMachineHistories[0]); foreach (var item in TimeMachineHistories[0]) ApplyHistoryToCanvas(item); + // 恢复多指书写模式状态 + RestoreMultiTouchModeState(0); } else { timeMachine.ImportTimeMachineHistory(TimeMachineHistories[CurrentWhiteboardIndex]); // 通过时间机器历史恢复所有内容(墨迹和图片) foreach (var item in TimeMachineHistories[CurrentWhiteboardIndex]) ApplyHistoryToCanvas(item); + // 恢复多指书写模式状态 + RestoreMultiTouchModeState(CurrentWhiteboardIndex); } @@ -177,6 +185,45 @@ namespace Ink_Canvas } } + /// + /// 恢复多指书写模式状态 + /// + private void RestoreMultiTouchModeState(int pageIndex) + { + try + { + // 检查是否保存了多指书写模式状态 + if (savedMultiTouchModeStates[pageIndex]) + { + // 恢复多指书写模式 + EnterMultiTouchModeIfNeeded(); + + // 更新UI状态 + if (ToggleSwitchEnableMultiTouchMode != null) + { + ToggleSwitchEnableMultiTouchMode.IsOn = true; + } + + LogHelper.WriteLogToFile($"恢复多指书写模式状态 - 页面索引: {pageIndex}", LogHelper.LogType.Info); + } + else + { + // 确保多指书写模式关闭 + ExitMultiTouchModeIfNeeded(); + + // 更新UI状态 + if (ToggleSwitchEnableMultiTouchMode != null) + { + ToggleSwitchEnableMultiTouchMode.IsOn = false; + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"恢复多指书写模式状态失败: {ex.Message}", LogHelper.LogType.Error); + } + } + private async void BtnWhiteBoardPageIndex_Click(object sender, EventArgs e) { if (sender == BtnLeftPageListWB) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 44495fc7..c3f1521a 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -2750,12 +2750,7 @@ namespace Ink_Canvas { // 清空触摸点计数器 dec.Clear(); - - // 重置多指触摸模式状态 - if (isInMultiTouchMode) - { - isInMultiTouchMode = false; - } + // 重置单指拖动模式状态 if (isSingleFingerDragMode) From b8e94cac9c541a694e936661bab2b1d77f42d20b Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 12:22:21 +0800 Subject: [PATCH 013/101] fix:issue #210 --- .../MainWindow_cs/MW_FloatingBarIcons.cs | 6 + Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 107 +++++++++++++++++- 2 files changed, 111 insertions(+), 2 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index c3f1521a..2efcce74 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -2782,6 +2782,12 @@ namespace Ink_Canvas ViewboxFloatingBar.IsHitTestVisible = true; BlackboardUIGridForInkReplay.IsHitTestVisible = true; + // 重置书写保护相关状态 + isWritingInProgress = false; + touchDownTimes.Clear(); + touchDownPositions.Clear(); + lastTouchPositions.Clear(); + } catch (Exception ex) { diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index d33e4db6..5ea06d11 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -23,8 +23,16 @@ namespace Ink_Canvas private bool isSingleFingerDragMode; private Point centerPoint = new Point(0, 0); private InkCanvasEditingMode lastInkCanvasEditingMode = InkCanvasEditingMode.Ink; - - /// + + // 书写保护相关变量 + private bool isWritingInProgress = false; + private DateTime lastTouchDownTime = DateTime.Now; + private const int WRITING_PROTECTION_DELAY_MS = 200; // 书写保护延迟时间(毫秒) + private Dictionary touchDownTimes = new Dictionary(); + private Dictionary touchDownPositions = new Dictionary(); + private Dictionary lastTouchPositions = new Dictionary(); + private const double GESTURE_MOVEMENT_THRESHOLD = 20.0; // 手势移动阈值(像素) + private const double WRITING_MOVEMENT_THRESHOLD = 5.0; // 书写移动阈值(像素) /// 保存画布上的非笔画元素(如图片、媒体元素等) /// private List PreserveNonStrokeElements() @@ -568,6 +576,17 @@ namespace Ink_Canvas ViewboxFloatingBar.IsHitTestVisible = false; BlackboardUIGridForInkReplay.IsHitTestVisible = false; dec.Add(e.TouchDevice.Id); + + // 记录触摸按下时间和位置,用于书写保护判断 + touchDownTimes[e.TouchDevice.Id] = DateTime.Now; + touchDownPositions[e.TouchDevice.Id] = e.GetTouchPoint(inkCanvas).Position; + + // 如果是第一个触摸点,标记书写开始 + if (dec.Count == 1) + { + isWritingInProgress = true; + lastTouchDownTime = DateTime.Now; + } // Palm Eraser 逻辑 - 优化:改进手掌判定条件,使用设备提供的触摸面积信息 if (Settings.Canvas.EnablePalmEraser && dec.Count >= 2 && !isPalmEraserActive && !palmEraserTouchDownHandled) @@ -679,6 +698,17 @@ namespace Ink_Canvas if (isInMultiTouchMode || !Settings.Gesture.IsEnableTwoFingerGesture) return; if (inkCanvas.EditingMode == InkCanvasEditingMode.None || inkCanvas.EditingMode == InkCanvasEditingMode.Select) return; + + // 书写保护:如果正在书写且时间间隔很短,延迟禁用画笔功能 + if (isWritingInProgress && dec.Count == 2) + { + var timeSinceFirstTouch = DateTime.Now - lastTouchDownTime; + if (timeSinceFirstTouch.TotalMilliseconds < WRITING_PROTECTION_DELAY_MS) + { + return; + } + } + lastInkCanvasEditingMode = inkCanvas.EditingMode; // 修复:几何绘制模式下禁止切回Ink if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint @@ -687,6 +717,18 @@ namespace Ink_Canvas { inkCanvas.EditingMode = InkCanvasEditingMode.None; } + + // 清除书写状态 + isWritingInProgress = false; + } + } + + private void inkCanvas_PreviewTouchMove(object sender, TouchEventArgs e) + { + // 更新触摸位置记录,用于手势检测 + if (lastTouchPositions.ContainsKey(e.TouchDevice.Id)) + { + lastTouchPositions[e.TouchDevice.Id] = e.GetTouchPoint(inkCanvas).Position; } } @@ -703,6 +745,17 @@ namespace Ink_Canvas // Palm Eraser 逻辑:优化状态恢复机制 dec.Remove(e.TouchDevice.Id); + + // 清理触摸记录 + touchDownTimes.Remove(e.TouchDevice.Id); + touchDownPositions.Remove(e.TouchDevice.Id); + lastTouchPositions.Remove(e.TouchDevice.Id); + + // 如果所有触摸点都抬起,清除书写状态 + if (dec.Count == 0) + { + isWritingInProgress = false; + } // 如果是手掌擦的触摸点,从记录中移除 if (palmEraserTouchIds.Contains(e.TouchDevice.Id)) @@ -1317,5 +1370,55 @@ namespace Ink_Canvas LogHelper.WriteLogToFile("Palm eraser timer recovery completed"); } } + + /// + /// 检测是否为手势操作而非书写 + /// + private bool IsGestureOperation() + { + if (dec.Count < 2) return false; + + // 检查触摸点之间的移动模式 + var currentTime = DateTime.Now; + var gestureIndicators = 0; + var totalMovement = 0.0; + + foreach (var touchId in dec) + { + if (touchDownTimes.ContainsKey(touchId) && touchDownPositions.ContainsKey(touchId) && lastTouchPositions.ContainsKey(touchId)) + { + var timeSinceTouch = currentTime - touchDownTimes[touchId]; + var initialPosition = touchDownPositions[touchId]; + var currentPosition = lastTouchPositions[touchId]; + + // 计算移动距离 + var movement = Math.Sqrt(Math.Pow(currentPosition.X - initialPosition.X, 2) + + Math.Pow(currentPosition.Y - initialPosition.Y, 2)); + totalMovement += movement; + + // 综合判断:时间、移动距离和触摸点数量 + if (timeSinceTouch.TotalMilliseconds < WRITING_PROTECTION_DELAY_MS && movement < WRITING_MOVEMENT_THRESHOLD) + { + // 短时间、小移动 - 可能是书写 + gestureIndicators--; + } + else if (timeSinceTouch.TotalMilliseconds > WRITING_PROTECTION_DELAY_MS || movement > GESTURE_MOVEMENT_THRESHOLD) + { + // 长时间或大移动 - 可能是手势 + gestureIndicators++; + } + } + } + + // 如果平均移动距离很大,更可能是手势 + var averageMovement = totalMovement / dec.Count; + if (averageMovement > GESTURE_MOVEMENT_THRESHOLD) + { + gestureIndicators += 2; + } + + // 如果大部分触摸点都满足手势条件,认为是手势操作 + return gestureIndicators > 0; + } } } From 349d4178692674fac86e3c5490db48b218af9392 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 12:35:30 +0800 Subject: [PATCH 014/101] fix:issue #205 --- Ink Canvas/MainWindow.xaml | 2 +- Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs | 165 +++++++++++++++----- 2 files changed, 126 insertions(+), 41 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 58f62b04..5e6a2e08 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -5538,7 +5538,7 @@ - + /// 安全地更新临时笔画,减少预览闪烁 + /// + /// 新的临时笔画 + private void UpdateTempStrokeSafely(Stroke newStroke) + { + // 节流机制:限制更新频率 + var now = DateTime.Now; + if ((now - lastUpdateTime).TotalMilliseconds < UpdateThrottleMs) + { + return; + } + lastUpdateTime = now; + + try + { + // 使用Dispatcher.BeginInvoke确保UI更新在UI线程上执行 + Dispatcher.BeginInvoke(new Action(() => + { + try + { + // 先添加新笔画,再删除旧笔画,减少视觉闪烁 + inkCanvas.Strokes.Add(newStroke); + + if (lastTempStroke != null && inkCanvas.Strokes.Contains(lastTempStroke)) + { + inkCanvas.Strokes.Remove(lastTempStroke); + } + + lastTempStroke = newStroke; + } + catch (Exception ex) + { + Debug.WriteLine($"UpdateTempStrokeSafely 失败: {ex.Message}"); + // 如果更新失败,确保清理状态 + if (lastTempStroke != null && inkCanvas.Strokes.Contains(lastTempStroke)) + { + try { inkCanvas.Strokes.Remove(lastTempStroke); } catch { } + } + lastTempStroke = newStroke; + try { inkCanvas.Strokes.Add(newStroke); } catch { } + } + }), DispatcherPriority.Render); + } + catch (Exception ex) + { + Debug.WriteLine($"UpdateTempStrokeSafely Dispatcher 失败: {ex.Message}"); + } + } + + /// + /// 安全地更新临时笔画集合,减少预览闪烁 + /// + /// 新的临时笔画集合 + private void UpdateTempStrokeCollectionSafely(StrokeCollection newStrokeCollection) + { + // 节流机制:限制更新频率 + var now = DateTime.Now; + if ((now - lastUpdateTime).TotalMilliseconds < UpdateThrottleMs) + { + return; + } + lastUpdateTime = now; + + try + { + // 使用Dispatcher.BeginInvoke确保UI更新在UI线程上执行 + Dispatcher.BeginInvoke(new Action(() => + { + try + { + // 先添加新笔画集合,再删除旧笔画集合,减少视觉闪烁 + inkCanvas.Strokes.Add(newStrokeCollection); + + if (lastTempStrokeCollection != null && lastTempStrokeCollection.Count > 0) + { + foreach (var stroke in lastTempStrokeCollection) + { + if (inkCanvas.Strokes.Contains(stroke)) + { + inkCanvas.Strokes.Remove(stroke); + } + } + } + + lastTempStrokeCollection = newStrokeCollection; + } + catch (Exception ex) + { + Debug.WriteLine($"UpdateTempStrokeCollectionSafely 失败: {ex.Message}"); + // 如果更新失败,确保清理状态 + if (lastTempStrokeCollection != null && lastTempStrokeCollection.Count > 0) + { + foreach (var stroke in lastTempStrokeCollection) + { + try { inkCanvas.Strokes.Remove(stroke); } catch { } + } + } + lastTempStrokeCollection = newStrokeCollection; + try { inkCanvas.Strokes.Add(newStrokeCollection); } catch { } + } + }), DispatcherPriority.Render); + } + catch (Exception ex) + { + Debug.WriteLine($"UpdateTempStrokeCollectionSafely Dispatcher 失败: {ex.Message}"); + } + } + private List GenerateEllipseGeometry(Point st, Point ed, bool isDrawTop = true, bool isDrawBottom = true) { From 7392fa816568cb5e60a39dccec2e50c98848d75d Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 12:38:22 +0800 Subject: [PATCH 015/101] fix:issue #204 --- .../MainWindow_cs/MW_FloatingBarIcons.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 2efcce74..f75bb322 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -1274,6 +1274,15 @@ namespace Ink_Canvas FloatingbarUIForInkReplay.IsHitTestVisible = true; BlackboardUIGridForInkReplay.Visibility = Visibility.Visible; BlackboardUIGridForInkReplay.IsHitTestVisible = true; + inkCanvas.IsHitTestVisible = true; + inkCanvas.IsManipulationEnabled = true; + + if (inkCanvas.EditingMode == InkCanvasEditingMode.None) + { + inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + } + + ResetTouchStates(); }); }).Start(); } @@ -1296,6 +1305,15 @@ namespace Ink_Canvas BlackboardUIGridForInkReplay.IsHitTestVisible = true; AnimationsHelper.HideWithFadeOut(BorderInkReplayToolBox); isStopInkReplay = true; + inkCanvas.IsHitTestVisible = true; + inkCanvas.IsManipulationEnabled = true; + + if (inkCanvas.EditingMode == InkCanvasEditingMode.None) + { + inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + } + + ResetTouchStates(); } } From b34f7142f66bc6e560387f1c09192b74b1824fa3 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 13:44:01 +0800 Subject: [PATCH 016/101] =?UTF-8?q?improve:=E5=A2=A8=E8=BF=B9=E5=B9=B3?= =?UTF-8?q?=E6=BB=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/AdvancedBezierSmoothing.cs | 415 ++++++++++++++++-- Ink Canvas/Helpers/InkSmoothingConfig.cs | 9 +- .../MW_SimulatePressure&InkToShape.cs | 20 + 3 files changed, 411 insertions(+), 33 deletions(-) diff --git a/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs b/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs index 2c61c0cf..51d0588f 100644 --- a/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs +++ b/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs @@ -95,18 +95,22 @@ namespace Ink_Canvas.Helpers // 使用改进的贝塞尔曲线拟合 var smoothedPoints = ApplyImprovedBezierSmoothing(originalPoints); + System.Diagnostics.Debug.WriteLine($"AsyncAdvancedBezierSmoothing: 原始点数={originalPoints.Length}, 平滑后点数={smoothedPoints.Length}"); + cancellationToken.ThrowIfCancellationRequested(); - // 严格控制点数,避免产生过多点 - if (smoothedPoints.Length > originalPoints.Length * 2) + // 放宽点数限制 + if (smoothedPoints.Length > originalPoints.Length * 3.0) { + System.Diagnostics.Debug.WriteLine($"AsyncAdvancedBezierSmoothing: 点数过多,进行重采样"); // 如果点数增加太多,进行重采样 smoothedPoints = ResampleEquidistantOptimized(smoothedPoints, ResampleInterval); } - // 最终检查:确保点数不会过多 - if (smoothedPoints.Length > originalPoints.Length * 1.5) + // 进一步放宽最终检查 + if (smoothedPoints.Length > originalPoints.Length * 2.5) { + System.Diagnostics.Debug.WriteLine($"AsyncAdvancedBezierSmoothing: 重采样后点数仍然过多,返回原始笔画"); // 如果仍然太多点,使用原始笔画 return stroke; } @@ -117,6 +121,7 @@ namespace Ink_Canvas.Helpers DrawingAttributes = stroke.DrawingAttributes.Clone() }; + System.Diagnostics.Debug.WriteLine($"AsyncAdvancedBezierSmoothing: 成功创建平滑笔画"); return smoothedStroke; } @@ -125,33 +130,42 @@ namespace Ink_Canvas.Helpers /// private StylusPoint[] ApplyImprovedBezierSmoothing(StylusPoint[] points) { - if (points.Length < 4) return points; + if (points.Length < 6) return points; // 5次贝塞尔需要6个点 var result = new List(); // 添加第一个点 result.Add(points[0]); - // 使用非重叠的窗口进行贝塞尔曲线拟合 - for (int i = 0; i < points.Length - 3; i += 3) // 每次移动3个点,避免重叠 + // 使用5次贝塞尔曲线,每次移动1个点确保连续性 + for (int i = 0; i < points.Length - 5; i++) { var p0 = points[i]; - var p1 = points[Math.Min(i + 1, points.Length - 1)]; - var p2 = points[Math.Min(i + 2, points.Length - 1)]; - var p3 = points[Math.Min(i + 3, points.Length - 1)]; + var p1 = points[i + 1]; + var p2 = points[i + 2]; + var p3 = points[i + 3]; + var p4 = points[i + 4]; + var p5 = points[i + 5]; - // 计算改进的控制点 - var controlPoints = CalculateImprovedControlPoints(p0, p1, p2, p3); + // 计算5次贝塞尔的控制点 + var controlPoints = CalculateQuinticControlPoints(p0, p1, p2, p3, p4, p5); - // 限制插值步数,避免点数爆炸 - int steps = Math.Min(UseAdaptiveInterpolation ? - CalculateAdaptiveSteps(p0, p1, p2, p3) : InterpolationSteps, 16); - - // 生成贝塞尔曲线点,但跳过第一个点避免重复 - for (int j = 1; j <= steps; j++) + // 生成插值点 + if (i == 0) { - double t = (double)j / steps; - var bezierPoint = CubicBezierWithControlPoints(controlPoints, t, p0, p3); + // 第一个窗口:生成更多插值点 + for (int j = 1; j <= 4; j++) + { + double t = (double)j / 5; + var bezierPoint = CalculateQuinticBezierPoint(p0, controlPoints, p5, t); + result.Add(bezierPoint); + } + } + else + { + // 后续窗口:只生成最后一个插值点,避免重复 + double t = 4.0 / 5.0; // 只取最后一个插值点 + var bezierPoint = CalculateQuinticBezierPoint(p0, controlPoints, p5, t); result.Add(bezierPoint); } } @@ -159,8 +173,209 @@ namespace Ink_Canvas.Helpers // 添加最后一个点 result.Add(points[points.Length - 1]); - // 去重和优化点数 - return RemoveDuplicatePoints(result.ToArray()); + System.Diagnostics.Debug.WriteLine($"ApplyImprovedBezierSmoothing: 原始点数={points.Length}, 生成点数={result.Count}"); + + // 使用更宽松的去重 + return RemoveDuplicatePointsLoose(result.ToArray()); + } + + /// + /// 5次贝塞尔曲线控制点计算 + /// + private (Point cp1, Point cp2, Point cp3, Point cp4) CalculateQuinticControlPoints( + StylusPoint p0, StylusPoint p1, StylusPoint p2, StylusPoint p3, StylusPoint p4, StylusPoint p5) + { + // 计算控制点距离(基于相邻点距离) + double dist1 = Math.Sqrt((p1.X - p0.X) * (p1.X - p0.X) + (p1.Y - p0.Y) * (p1.Y - p0.Y)); + double dist2 = Math.Sqrt((p2.X - p1.X) * (p2.X - p1.X) + (p2.Y - p1.Y) * (p2.Y - p1.Y)); + double dist3 = Math.Sqrt((p4.X - p3.X) * (p4.X - p3.X) + (p4.Y - p3.Y) * (p4.Y - p3.Y)); + double dist4 = Math.Sqrt((p5.X - p4.X) * (p5.X - p4.X) + (p5.Y - p4.Y) * (p5.Y - p4.Y)); + + // 使用更小的控制点距离,产生超平滑的曲线 + double controlDist1 = dist1 * 0.15; + double controlDist2 = dist2 * 0.15; + double controlDist3 = dist3 * 0.15; + double controlDist4 = dist4 * 0.15; + + // 计算控制点方向 - 使用更平滑的方向计算 + double dir1X = p2.X - p0.X; + double dir1Y = p2.Y - p0.Y; + double dir2X = p3.X - p1.X; + double dir2Y = p3.Y - p1.Y; + double dir3X = p4.X - p2.X; + double dir3Y = p4.Y - p2.Y; + double dir4X = p5.X - p3.X; + double dir4Y = p5.Y - p3.Y; + + // 归一化方向 + NormalizeVector(ref dir1X, ref dir1Y); + NormalizeVector(ref dir2X, ref dir2Y); + NormalizeVector(ref dir3X, ref dir3Y); + NormalizeVector(ref dir4X, ref dir4Y); + + // 计算控制点 + var cp1 = new Point(p1.X + dir1X * controlDist1, p1.Y + dir1Y * controlDist1); + var cp2 = new Point(p2.X + dir2X * controlDist2, p2.Y + dir2Y * controlDist2); + var cp3 = new Point(p3.X - dir3X * controlDist3, p3.Y - dir3Y * controlDist3); + var cp4 = new Point(p4.X - dir4X * controlDist4, p4.Y - dir4Y * controlDist4); + + return (cp1, cp2, cp3, cp4); + } + + /// + /// 归一化向量 + /// + private void NormalizeVector(ref double x, ref double y) + { + double length = Math.Sqrt(x * x + y * y); + if (length > 0) + { + x /= length; + y /= length; + } + } + + /// + /// 5次贝塞尔曲线点计算 + /// + private StylusPoint CalculateQuinticBezierPoint(StylusPoint p0, (Point cp1, Point cp2, Point cp3, Point cp4) controlPoints, StylusPoint p5, double t) + { + double oneMinusT = 1 - t; + double oneMinusT2 = oneMinusT * oneMinusT; + double oneMinusT3 = oneMinusT2 * oneMinusT; + double oneMinusT4 = oneMinusT3 * oneMinusT; + double oneMinusT5 = oneMinusT4 * oneMinusT; + + double t2 = t * t; + double t3 = t2 * t; + double t4 = t3 * t; + double t5 = t4 * t; + + // 5次贝塞尔曲线公式 + double x = oneMinusT5 * p0.X + + 5 * oneMinusT4 * t * controlPoints.cp1.X + + 10 * oneMinusT3 * t2 * controlPoints.cp2.X + + 10 * oneMinusT2 * t3 * controlPoints.cp3.X + + 5 * oneMinusT * t4 * controlPoints.cp4.X + + t5 * p5.X; + + double y = oneMinusT5 * p0.Y + + 5 * oneMinusT4 * t * controlPoints.cp1.Y + + 10 * oneMinusT3 * t2 * controlPoints.cp2.Y + + 10 * oneMinusT2 * t3 * controlPoints.cp3.Y + + 5 * oneMinusT * t4 * controlPoints.cp4.Y + + t5 * p5.Y; + + // 压力插值 - 使用线性插值 + float pressure = (float)((1 - t) * p0.PressureFactor + t * p5.PressureFactor); + + return new StylusPoint(x, y, Math.Max(pressure, 0.1f)); + } + + /// + /// 简化的控制点计算 + /// + private (Point cp1, Point cp2) CalculateSimpleControlPoints(StylusPoint p0, StylusPoint p1, StylusPoint p2, StylusPoint p3) + { + // 计算控制点距离(基于线段长度) + double dist1 = Math.Sqrt((p1.X - p0.X) * (p1.X - p0.X) + (p1.Y - p0.Y) * (p1.Y - p0.Y)); + double dist2 = Math.Sqrt((p3.X - p2.X) * (p3.X - p2.X) + (p3.Y - p2.Y) * (p3.Y - p2.Y)); + + // 使用更小的控制点距离,产生更平滑的曲线 + double controlDist1 = dist1 * 0.2; // 进一步减少控制点影响 + double controlDist2 = dist2 * 0.2; + + // 计算控制点方向 - 使用更平滑的方向计算 + double dir1X = p2.X - p0.X; // 使用更远的点计算方向 + double dir1Y = p2.Y - p0.Y; + double dir2X = p3.X - p1.X; + double dir2Y = p3.Y - p1.Y; + + // 归一化方向 + double len1 = Math.Sqrt(dir1X * dir1X + dir1Y * dir1Y); + double len2 = Math.Sqrt(dir2X * dir2X + dir2Y * dir2Y); + + if (len1 > 0) + { + dir1X /= len1; + dir1Y /= len1; + } + + if (len2 > 0) + { + dir2X /= len2; + dir2Y /= len2; + } + + // 计算控制点 + var cp1 = new Point( + p1.X + dir1X * controlDist1, + p1.Y + dir1Y * controlDist1 + ); + + var cp2 = new Point( + p2.X - dir2X * controlDist2, + p2.Y - dir2Y * controlDist2 + ); + + return (cp1, cp2); + } + + /// + /// 宽松的去重算法 + /// + private StylusPoint[] RemoveDuplicatePointsLoose(StylusPoint[] points) + { + if (points.Length < 2) return points; + + var result = new List(); + result.Add(points[0]); + + double minDistance = 0.1; // 非常小的距离阈值,几乎不去重 + + for (int i = 1; i < points.Length; i++) + { + var lastPoint = result[result.Count - 1]; + var currentPoint = points[i]; + + // 计算距离 + double distance = Math.Sqrt( + (currentPoint.X - lastPoint.X) * (currentPoint.X - lastPoint.X) + + (currentPoint.Y - lastPoint.Y) * (currentPoint.Y - lastPoint.Y)); + + // 如果距离足够大,添加这个点 + if (distance >= minDistance) + { + result.Add(currentPoint); + } + } + + System.Diagnostics.Debug.WriteLine($"RemoveDuplicatePointsLoose: 输入点数={points.Length}, 输出点数={result.Count}"); + return result.ToArray(); + } + + /// + /// 计算贝塞尔曲线上的点 + /// + private StylusPoint CalculateBezierPoint(StylusPoint p0, Point cp1, Point cp2, StylusPoint p3, double t) + { + double x = Math.Pow(1 - t, 3) * p0.X + + 3 * Math.Pow(1 - t, 2) * t * cp1.X + + 3 * (1 - t) * Math.Pow(t, 2) * cp2.X + + Math.Pow(t, 3) * p3.X; + + double y = Math.Pow(1 - t, 3) * p0.Y + + 3 * Math.Pow(1 - t, 2) * t * cp1.Y + + 3 * (1 - t) * Math.Pow(t, 2) * cp2.Y + + Math.Pow(t, 3) * p3.Y; + + // 压力插值 + float pressure = (float)(Math.Pow(1 - t, 3) * p0.PressureFactor + + 3 * Math.Pow(1 - t, 2) * t * p0.PressureFactor + + 3 * (1 - t) * Math.Pow(t, 2) * p3.PressureFactor + + Math.Pow(t, 3) * p3.PressureFactor); + + return new StylusPoint(x, y, Math.Max(pressure, 0.1f)); } /// @@ -251,7 +466,7 @@ namespace Ink_Canvas.Helpers var result = new List(); result.Add(points[0]); - double minDistance = ResampleInterval * 0.5; // 最小距离阈值 + double minDistance = 0.3; // 进一步减少最小距离阈值,保留更多平滑点 for (int i = 1; i < points.Length; i++) { @@ -270,6 +485,7 @@ namespace Ink_Canvas.Helpers } } + System.Diagnostics.Debug.WriteLine($"RemoveDuplicatePoints: 输入点数={points.Length}, 输出点数={result.Count}"); return result.ToArray(); } @@ -516,23 +732,31 @@ namespace Ink_Canvas.Helpers /// public class AdvancedBezierSmoothing { - public double SmoothingStrength { get; set; } = 0.3; - public double ResampleInterval { get; set; } = 3.0; - public int InterpolationSteps { get; set; } = 8; + public double SmoothingStrength { get; set; } = 0.6; + public double ResampleInterval { get; set; } = 2.0; + public int InterpolationSteps { get; set; } = 12; public Stroke SmoothStroke(Stroke stroke) { if (stroke == null || stroke.StylusPoints.Count < 3) + { + System.Diagnostics.Debug.WriteLine($"AdvancedBezierSmoothing: 笔画点数不足,跳过平滑 (点数: {stroke?.StylusPoints.Count ?? 0})"); return stroke; + } - var originalPoints = stroke.StylusPoints.ToList(); + System.Diagnostics.Debug.WriteLine($"AdvancedBezierSmoothing: 开始平滑处理,原始点数: {stroke.StylusPoints.Count}"); - // 简化处理:只进行轻度平滑 - var smoothedPoints = ApplyLightExponentialSmoothing(originalPoints, 0.2); // 很轻的平滑 + var originalPoints = stroke.StylusPoints.ToArray(); + + // 使用真正的贝塞尔曲线平滑 + var smoothedPoints = ApplyCubicBezierSmoothing(originalPoints); + + System.Diagnostics.Debug.WriteLine($"AdvancedBezierSmoothing: 平滑完成,平滑后点数: {smoothedPoints.Length}"); // 检查点数是否合理 - if (smoothedPoints.Count > originalPoints.Count * 1.5) + if (smoothedPoints.Length > originalPoints.Length * 10.0) { + System.Diagnostics.Debug.WriteLine($"AdvancedBezierSmoothing: 点数增加过多,返回原始笔画 (原始:{originalPoints.Length}, 平滑后:{smoothedPoints.Length})"); return stroke; // 如果点数增加太多,返回原始笔画 } @@ -540,9 +764,140 @@ namespace Ink_Canvas.Helpers { DrawingAttributes = stroke.DrawingAttributes.Clone() }; + + System.Diagnostics.Debug.WriteLine($"AdvancedBezierSmoothing: 创建平滑笔画成功"); return smoothedStroke; } + /// + /// 三次贝塞尔曲线平滑 + /// + private StylusPoint[] ApplyCubicBezierSmoothing(StylusPoint[] points) + { + if (points.Length < 4) return points; + + var result = new List(); + result.Add(points[0]); + + // 使用更保守的窗口大小和插值 + int windowSize = Math.Min(4, points.Length); + int stepSize = Math.Max(1, points.Length / 10); // 根据点数动态调整步长 + + for (int i = 0; i <= points.Length - windowSize; i += stepSize) + { + if (i + windowSize - 1 >= points.Length) break; + + var p0 = points[i]; + var p1 = points[Math.Min(i + 1, points.Length - 1)]; + var p2 = points[Math.Min(i + 2, points.Length - 1)]; + var p3 = points[Math.Min(i + windowSize - 1, points.Length - 1)]; + + // 计算控制点 + var controlPoints = CalculateControlPoints(p0, p1, p2, p3); + + // 只生成2-3个插值点 + int steps = 2; + + // 生成贝塞尔曲线点 + for (int j = 1; j <= steps; j++) + { + double t = (double)j / steps; + var bezierPoint = CalculateBezierPoint(p0, controlPoints.cp1, controlPoints.cp2, p3, t); + result.Add(bezierPoint); + } + } + + result.Add(points[points.Length - 1]); + + // 去重处理 + return RemoveDuplicatePoints(result.ToArray()); + } + + /// + /// 去除重复点 + /// + private StylusPoint[] RemoveDuplicatePoints(StylusPoint[] points) + { + if (points.Length <= 1) return points; + + var result = new List { points[0] }; + double minDistance = 1.0; // 最小距离阈值 + + for (int i = 1; i < points.Length; i++) + { + var lastPoint = result[result.Count - 1]; + var currentPoint = points[i]; + + double distance = Math.Sqrt(Math.Pow(currentPoint.X - lastPoint.X, 2) + + Math.Pow(currentPoint.Y - lastPoint.Y, 2)); + + if (distance > minDistance) + { + result.Add(currentPoint); + } + } + + return result.ToArray(); + } + + /// + /// 计算控制点 + /// + private (Point cp1, Point cp2) CalculateControlPoints(StylusPoint p0, StylusPoint p1, StylusPoint p2, StylusPoint p3) + { + // 计算切线方向 + var tangent1 = new Vector(p1.X - p0.X, p1.Y - p0.Y); + var tangent2 = new Vector(p3.X - p2.X, p3.Y - p2.Y); + + // 归一化切线 + if (tangent1.Length > 0) tangent1.Normalize(); + if (tangent2.Length > 0) tangent2.Normalize(); + + // 计算控制点距离 + double dist1 = Math.Sqrt((p1.X - p0.X) * (p1.X - p0.X) + (p1.Y - p0.Y) * (p1.Y - p0.Y)); + double dist2 = Math.Sqrt((p3.X - p2.X) * (p3.X - p2.X) + (p3.Y - p2.Y) * (p3.Y - p2.Y)); + + double controlDist1 = dist1 * SmoothingStrength; + double controlDist2 = dist2 * SmoothingStrength; + + // 计算控制点 + var cp1 = new Point( + p1.X + tangent1.X * controlDist1, + p1.Y + tangent1.Y * controlDist1 + ); + + var cp2 = new Point( + p2.X - tangent2.X * controlDist2, + p2.Y - tangent2.Y * controlDist2 + ); + + return (cp1, cp2); + } + + /// + /// 计算贝塞尔曲线上的点 + /// + private StylusPoint CalculateBezierPoint(StylusPoint p0, Point cp1, Point cp2, StylusPoint p3, double t) + { + double x = Math.Pow(1 - t, 3) * p0.X + + 3 * Math.Pow(1 - t, 2) * t * cp1.X + + 3 * (1 - t) * Math.Pow(t, 2) * cp2.X + + Math.Pow(t, 3) * p3.X; + + double y = Math.Pow(1 - t, 3) * p0.Y + + 3 * Math.Pow(1 - t, 2) * t * cp1.Y + + 3 * (1 - t) * Math.Pow(t, 2) * cp2.Y + + Math.Pow(t, 3) * p3.Y; + + // 压力插值 + float pressure = (float)(Math.Pow(1 - t, 3) * p0.PressureFactor + + 3 * Math.Pow(1 - t, 2) * t * p0.PressureFactor + + 3 * (1 - t) * Math.Pow(t, 2) * p3.PressureFactor + + Math.Pow(t, 3) * p3.PressureFactor); + + return new StylusPoint(x, y, Math.Max(pressure, 0.1f)); + } + /// /// 轻度指数平滑 /// diff --git a/Ink Canvas/Helpers/InkSmoothingConfig.cs b/Ink Canvas/Helpers/InkSmoothingConfig.cs index 6cb996bb..c1af933d 100644 --- a/Ink Canvas/Helpers/InkSmoothingConfig.cs +++ b/Ink Canvas/Helpers/InkSmoothingConfig.cs @@ -75,6 +75,9 @@ namespace Ink_Canvas.Helpers /// public void ApplyQualitySettings() { + // 保存用户设置的异步处理偏好 + bool userAsyncPreference = UseAsyncProcessing; + switch (Quality) { case SmoothingQuality.Performance: @@ -85,7 +88,7 @@ namespace Ink_Canvas.Helpers CurveTension = 0.15; MaxConcurrentTasks = Math.Max(1, Environment.ProcessorCount / 2); UseHardwareAcceleration = true; - UseAsyncProcessing = true; + UseAsyncProcessing = userAsyncPreference; break; case SmoothingQuality.Balanced: @@ -96,7 +99,7 @@ namespace Ink_Canvas.Helpers CurveTension = 0.25; MaxConcurrentTasks = Environment.ProcessorCount; UseHardwareAcceleration = true; - UseAsyncProcessing = true; + UseAsyncProcessing = userAsyncPreference; break; case SmoothingQuality.Quality: @@ -107,7 +110,7 @@ namespace Ink_Canvas.Helpers CurveTension = 0.35; MaxConcurrentTasks = Environment.ProcessorCount; UseHardwareAcceleration = true; - UseAsyncProcessing = true; + UseAsyncProcessing = userAsyncPreference; break; } } diff --git a/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs b/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs index 15f866e3..65003790 100644 --- a/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs +++ b/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs @@ -717,16 +717,22 @@ namespace Ink_Canvas catch { } // 应用高级贝塞尔曲线平滑(仅在未进行直线拉直时) + Debug.WriteLine($"墨迹平滑检查: UseAdvancedBezierSmoothing={Settings.Canvas.UseAdvancedBezierSmoothing}, wasStraightened={wasStraightened}"); + Debug.WriteLine($"异步平滑设置: UseAsyncInkSmoothing={Settings.Canvas.UseAsyncInkSmoothing}, _inkSmoothingManager={_inkSmoothingManager != null}"); + if (Settings.Canvas.UseAdvancedBezierSmoothing && !wasStraightened) { try { + Debug.WriteLine($"开始墨迹平滑处理: 原始点数={e.Stroke.StylusPoints.Count}, 直线拉直={wasStraightened}"); + // 检查原始笔画是否仍然存在于画布中 if (inkCanvas.Strokes.Contains(e.Stroke)) { // 使用新的异步墨迹平滑管理器 if (Settings.Canvas.UseAsyncInkSmoothing && _inkSmoothingManager != null) { + Debug.WriteLine("使用异步墨迹平滑"); // 异步处理 _ = ProcessStrokeAsync(e.Stroke); } @@ -746,6 +752,10 @@ namespace Ink_Canvas } } } + else + { + Debug.WriteLine("原始笔画不在画布中,跳过平滑处理"); + } } catch (Exception ex) { @@ -766,17 +776,27 @@ namespace Ink_Canvas { try { + Debug.WriteLine($"异步平滑开始: 原始点数={originalStroke.StylusPoints.Count}"); await _inkSmoothingManager.SmoothStrokeAsync(originalStroke, (original, smoothed) => { + Debug.WriteLine($"异步平滑完成: 原始点数={original.StylusPoints.Count}, 平滑后点数={smoothed.StylusPoints.Count}"); + Debug.WriteLine($"墨迹比较: smoothed != original = {smoothed != original}"); + Debug.WriteLine($"画布包含原始墨迹: {inkCanvas.Strokes.Contains(original)}"); + // 在UI线程上执行笔画替换 if (inkCanvas.Strokes.Contains(original) && smoothed != original) { + Debug.WriteLine("异步替换原始笔画为平滑后的笔画"); SetNewBackupOfStroke(); _currentCommitType = CommitReason.ShapeRecognition; inkCanvas.Strokes.Remove(original); inkCanvas.Strokes.Add(smoothed); _currentCommitType = CommitReason.UserInput; } + else + { + Debug.WriteLine($"异步平滑后的笔画与原始笔画相同,未进行替换 (contains={inkCanvas.Strokes.Contains(original)}, different={smoothed != original})"); + } }); } catch (Exception ex) From 933c695b8c21ae479b0ea130472290651aefb616 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 14:02:29 +0800 Subject: [PATCH 017/101] fix:issue #133 --- .../MainWindow_cs/MW_FloatingBarIcons.cs | 3 - Ink Canvas/MainWindow_cs/MW_Settings.cs | 4 + Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 277 ++++-------------- Ink Canvas/Resources/Settings.cs | 12 + 4 files changed, 67 insertions(+), 229 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index f75bb322..a6df1ddd 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -2784,9 +2784,6 @@ namespace Ink_Canvas if (isPalmEraserActive) { isPalmEraserActive = false; - palmEraserTouchDownHandled = false; - palmEraserTouchIds.Clear(); - StopPalmEraserRecoveryTimer(); } // 确保触摸事件能正常响应 diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index 7bbf2d4d..4d521935 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -1980,6 +1980,10 @@ namespace Ink_Canvas Settings.Advanced.TouchMultiplier = 0.3; Settings.Advanced.NibModeBoundsWidth = 5; Settings.Advanced.FingerModeBoundsWidth = 20; + Settings.Advanced.NibModeBoundsWidthThresholdValue = 2.5; + Settings.Advanced.FingerModeBoundsWidthThresholdValue = 2.5; + Settings.Advanced.NibModeBoundsWidthEraserSize = 0.8; + Settings.Advanced.FingerModeBoundsWidthEraserSize = 0.8; Settings.Advanced.EraserBindTouchMultiplier = true; Settings.Advanced.IsLogEnabled = true; Settings.Advanced.IsSecondConfirmWhenShutdownApp = false; diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index 5ea06d11..24e0e73b 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -508,11 +508,13 @@ namespace Ink_Canvas private InkCanvasEditingMode palmEraserLastEditingMode = InkCanvasEditingMode.Ink; private bool palmEraserLastIsHighlighter; private bool palmEraserWasEnabledBeforeMultiTouch; - private bool palmEraserTouchDownHandled; // 新增:标记手掌擦触摸按下是否已处理 - private DateTime palmEraserActivationTime; // 新增:记录手掌擦激活时间 - private const int PALM_ERASER_TIMEOUT_MS = 3000; // 修改:减少手掌擦超时时间(3秒) - private DispatcherTimer palmEraserRecoveryTimer; // 新增:手掌擦恢复定时器 - private HashSet palmEraserTouchIds = new HashSet(); // 新增:记录参与手掌擦的触摸点ID + + public double GetTouchBoundWidth(TouchEventArgs e) + { + var args = e.GetTouchPoint(null).Bounds; + if (!Settings.Advanced.IsQuadIR) return args.Width; + else return Math.Sqrt(args.Width * args.Height); // 四边红外 + } private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e) { @@ -588,78 +590,54 @@ namespace Ink_Canvas lastTouchDownTime = DateTime.Now; } - // Palm Eraser 逻辑 - 优化:改进手掌判定条件,使用设备提供的触摸面积信息 - if (Settings.Canvas.EnablePalmEraser && dec.Count >= 2 && !isPalmEraserActive && !palmEraserTouchDownHandled) + // Palm Eraser 逻辑 + if (Settings.Canvas.EnablePalmEraser && dec.Count >= 2 && !isPalmEraserActive) { touchPoint = e.GetTouchPoint(inkCanvas); - var size = touchPoint.Size; // 使用设备提供的触摸面积信息 - var bounds = touchPoint.Bounds; // 保留bounds用于宽高比计算 + double boundWidth = GetTouchBoundWidth(e); - // 根据敏感度设置调整判定参数 - double palmAreaThreshold; // 改为面积阈值 - double aspectRatioThreshold; - int minTouchPoints; - switch (Settings.Canvas.PalmEraserSensitivity) + if ((Settings.Advanced.TouchMultiplier != 0 || !Settings.Advanced.IsSpecialScreen) + && (boundWidth > BoundsWidth)) { - case 0: // 低敏感度 - 更严格的判定 - palmAreaThreshold = 6400; // 80*80的面积 - aspectRatioThreshold = 0.4; - minTouchPoints = 4; - break; - case 1: // 中敏感度 - 平衡的判定 - palmAreaThreshold = 3600; // 60*60的面积 - aspectRatioThreshold = 0.3; - minTouchPoints = 3; - break; - case 2: // 高敏感度 - 较宽松的判定 - default: - palmAreaThreshold = 2500; // 50*50的面积 - aspectRatioThreshold = 0.25; - minTouchPoints = 2; - break; - } - - // 计算触摸面积(使用设备提供的Size) - double touchArea = size.Width * size.Height; - - // 计算宽高比(使用Bounds确保准确性) - double aspectRatio = Math.Min(bounds.Width, bounds.Height) / Math.Max(bounds.Width, bounds.Height); - - // 改进的手掌判定条件:使用面积而不是单独的宽高 - bool isLargeTouch = touchArea >= palmAreaThreshold; - bool isPalmLikeShape = aspectRatio >= aspectRatioThreshold; - bool hasMultipleTouchPoints = dec.Count >= minTouchPoints; - - // 新增:额外的判定条件提高准确性 - bool isReasonableSize = size.Width >= 20 && size.Height >= 20 && size.Width <= 200 && size.Height <= 200; // 合理的触摸尺寸范围 - bool isNotTooElongated = aspectRatio >= 0.2; // 避免过于细长的触摸(可能是手指) - bool hasEnoughArea = touchArea >= 400; // 最小面积要求,避免小面积误判 - - if (isLargeTouch && isPalmLikeShape && hasMultipleTouchPoints && isReasonableSize && isNotTooElongated && hasEnoughArea) - { - // 记录当前编辑模式和高光状态 - palmEraserLastEditingMode = inkCanvas.EditingMode; - palmEraserLastIsHighlighter = drawingAttributes.IsHighlighter; - - // 记录参与手掌擦的触摸点ID - palmEraserTouchIds.Clear(); - foreach (int touchId in dec) + // 根据敏感度调整阈值倍数 + double thresholdMultiplier; + switch (Settings.Canvas.PalmEraserSensitivity) { - palmEraserTouchIds.Add(touchId); + case 0: // 低敏感度 + thresholdMultiplier = 3.0; + break; + case 1: // 中敏感度 + thresholdMultiplier = 2.5; + break; + case 2: // 高敏感度 + default: + thresholdMultiplier = 2.0; + break; } - // 切换为橡皮擦 - EraserIcon_Click(null, null); - isPalmEraserActive = true; - palmEraserActivationTime = DateTime.Now; // 记录激活时间 - palmEraserTouchDownHandled = true; // 标记已处理 + double EraserThresholdValue = Settings.Startup.IsEnableNibMode ? + Settings.Advanced.NibModeBoundsWidthThresholdValue : + Settings.Advanced.FingerModeBoundsWidthThresholdValue; + + if (boundWidth > BoundsWidth * EraserThresholdValue * thresholdMultiplier) + { + // 记录当前编辑模式和高光状态 + palmEraserLastEditingMode = inkCanvas.EditingMode; + palmEraserLastIsHighlighter = drawingAttributes.IsHighlighter; - // 启动恢复定时器,防止卡死 - StartPalmEraserRecoveryTimer(); - - // 记录日志 - LogHelper.WriteLogToFile($"Palm eraser activated - Sensitivity: {Settings.Canvas.PalmEraserSensitivity}, Touch area: {touchArea:F0}, Size: {size.Width}x{size.Height}, Bounds: {bounds.Width}x{bounds.Height}, Aspect ratio: {aspectRatio:F2}, Touch points: {dec.Count}, Reasonable size: {isReasonableSize}, Not elongated: {isNotTooElongated}, Enough area: {hasEnoughArea}"); + // 动态调整橡皮大小 + boundWidth *= (Settings.Startup.IsEnableNibMode ? + Settings.Advanced.NibModeBoundsWidthEraserSize : + Settings.Advanced.FingerModeBoundsWidthEraserSize); + + if (Settings.Advanced.IsSpecialScreen) + boundWidth *= Settings.Advanced.TouchMultiplier; + + inkCanvas.EraserShape = new EllipseStylusShape(boundWidth, boundWidth); + inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint; + isPalmEraserActive = true; + } } } @@ -743,7 +721,7 @@ namespace Ink_Canvas ViewboxFloatingBar.IsHitTestVisible = true; BlackboardUIGridForInkReplay.IsHitTestVisible = true; - // Palm Eraser 逻辑:优化状态恢复机制 + // Palm Eraser 逻辑 dec.Remove(e.TouchDevice.Id); // 清理触摸记录 @@ -757,21 +735,15 @@ namespace Ink_Canvas isWritingInProgress = false; } - // 如果是手掌擦的触摸点,从记录中移除 - if (palmEraserTouchIds.Contains(e.TouchDevice.Id)) + // 当手掌擦激活且所有触摸点都抬起时,恢复原编辑模式 + if (isPalmEraserActive && dec.Count == 0) { - palmEraserTouchIds.Remove(e.TouchDevice.Id); - } - - // 当所有手掌擦触摸点都抬起时,恢复原编辑模式 - if (isPalmEraserActive && palmEraserTouchIds.Count == 0) - { - LogHelper.WriteLogToFile($"Palm eraser recovery triggered - Touch points remaining: {palmEraserTouchIds.Count}, dec.Count: {dec.Count}"); + LogHelper.WriteLogToFile($"Palm eraser recovery triggered - Touch points remaining: {dec.Count}"); // 恢复高光状态 drawingAttributes.IsHighlighter = palmEraserLastIsHighlighter; - // 恢复编辑模式 - 优化:改进状态恢复逻辑 + // 恢复编辑模式 try { if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) @@ -802,71 +774,10 @@ namespace Ink_Canvas // 重置手掌擦状态 isPalmEraserActive = false; - palmEraserTouchDownHandled = false; - palmEraserTouchIds.Clear(); - - // 停止恢复定时器 - StopPalmEraserRecoveryTimer(); - - // 确保触摸事件能正常响应 - inkCanvas.IsHitTestVisible = true; - inkCanvas.IsManipulationEnabled = true; - - ViewboxFloatingBar.IsHitTestVisible = true; - BlackboardUIGridForInkReplay.IsHitTestVisible = true; LogHelper.WriteLogToFile("Palm eraser state reset completed"); } - // 新增:超时检测 - 如果手掌擦激活时间过长,强制重置状态 - if (isPalmEraserActive) - { - var timeSinceActivation = DateTime.Now - palmEraserActivationTime; - if (timeSinceActivation.TotalMilliseconds > PALM_ERASER_TIMEOUT_MS) - { - LogHelper.WriteLogToFile($"Palm eraser timeout detected ({timeSinceActivation.TotalMilliseconds}ms), forcing recovery", LogHelper.LogType.Warning); - - // 强制恢复状态 - try - { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) - { - switch (palmEraserLastEditingMode) - { - case InkCanvasEditingMode.Ink: - PenIcon_Click(null, null); - break; - case InkCanvasEditingMode.Select: - SymbolIconSelect_MouseUp(null, null); - break; - default: - inkCanvas.EditingMode = palmEraserLastEditingMode; - break; - } - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"Palm eraser timeout recovery failed: {ex.Message}, forcing to Ink mode", LogHelper.LogType.Error); - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; - } - - // 重置所有手掌擦状态 - isPalmEraserActive = false; - palmEraserTouchDownHandled = false; - palmEraserTouchIds.Clear(); - inkCanvas.IsHitTestVisible = true; - inkCanvas.IsManipulationEnabled = true; - - ViewboxFloatingBar.IsHitTestVisible = true; - BlackboardUIGridForInkReplay.IsHitTestVisible = true; - - // 停止恢复定时器 - StopPalmEraserRecoveryTimer(); - - LogHelper.WriteLogToFile("Palm eraser timeout recovery completed"); - } - } // 修复:几何绘制模式下,触摸抬手时应该正确处理,而不是简单模拟鼠标事件 if (drawingShapeMode != 0) { @@ -963,16 +874,12 @@ namespace Ink_Canvas // 如果手掌擦还在激活状态但触摸点已清空,强制重置状态 isPalmEraserActive = false; - palmEraserTouchDownHandled = false; - palmEraserTouchIds.Clear(); // 确保清空触摸点ID inkCanvas.IsHitTestVisible = true; inkCanvas.IsManipulationEnabled = true; ViewboxFloatingBar.IsHitTestVisible = true; BlackboardUIGridForInkReplay.IsHitTestVisible = true; - // 停止恢复定时器 - StopPalmEraserRecoveryTimer(); LogHelper.WriteLogToFile("Palm eraser force recovery completed"); } @@ -1288,88 +1195,6 @@ namespace Ink_Canvas } } - /// - /// 启动手掌擦恢复定时器,防止卡死状态 - /// - private void StartPalmEraserRecoveryTimer() - { - if (palmEraserRecoveryTimer == null) - { - palmEraserRecoveryTimer = new DispatcherTimer(); - palmEraserRecoveryTimer.Interval = TimeSpan.FromMilliseconds(1000); // 每秒检查一次 - palmEraserRecoveryTimer.Tick += PalmEraserRecoveryTimer_Tick; - } - - palmEraserRecoveryTimer.Start(); - } - - /// - /// 停止手掌擦恢复定时器 - /// - private void StopPalmEraserRecoveryTimer() - { - if (palmEraserRecoveryTimer != null) - { - palmEraserRecoveryTimer.Stop(); - } - } - - /// - /// 手掌擦恢复定时器事件处理 - /// - private void PalmEraserRecoveryTimer_Tick(object sender, EventArgs e) - { - if (!isPalmEraserActive) return; - - // 检查是否超时 - var timeSinceActivation = DateTime.Now - palmEraserActivationTime; - if (timeSinceActivation.TotalMilliseconds > PALM_ERASER_TIMEOUT_MS) - { - LogHelper.WriteLogToFile($"Palm eraser recovery timer triggered, forcing recovery after {timeSinceActivation.TotalMilliseconds}ms", LogHelper.LogType.Warning); - - // 强制恢复状态 - try - { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) - { - switch (palmEraserLastEditingMode) - { - case InkCanvasEditingMode.Ink: - PenIcon_Click(null, null); - break; - case InkCanvasEditingMode.Select: - SymbolIconSelect_MouseUp(null, null); - break; - default: - inkCanvas.EditingMode = palmEraserLastEditingMode; - break; - } - - LogHelper.WriteLogToFile($"Palm eraser timer recovery to mode: {palmEraserLastEditingMode}"); - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"Palm eraser recovery timer failed: {ex.Message}, forcing to Ink mode", LogHelper.LogType.Error); - inkCanvas.EditingMode = InkCanvasEditingMode.Ink; - } - - // 重置所有手掌擦状态 - isPalmEraserActive = false; - palmEraserTouchDownHandled = false; - palmEraserTouchIds.Clear(); - inkCanvas.IsHitTestVisible = true; - inkCanvas.IsManipulationEnabled = true; - - ViewboxFloatingBar.IsHitTestVisible = true; - BlackboardUIGridForInkReplay.IsHitTestVisible = true; - - // 停止定时器 - StopPalmEraserRecoveryTimer(); - - LogHelper.WriteLogToFile("Palm eraser timer recovery completed"); - } - } /// /// 检测是否为手势操作而非书写 diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs index 5e758505..f2afd357 100644 --- a/Ink Canvas/Resources/Settings.cs +++ b/Ink Canvas/Resources/Settings.cs @@ -514,6 +514,18 @@ namespace Ink_Canvas [JsonProperty("fingerModeBoundsWidth")] public int FingerModeBoundsWidth { get; set; } = 30; + [JsonProperty("nibModeBoundsWidthThresholdValue")] + public double NibModeBoundsWidthThresholdValue { get; set; } = 2.5; + + [JsonProperty("fingerModeBoundsWidthThresholdValue")] + public double FingerModeBoundsWidthThresholdValue { get; set; } = 2.5; + + [JsonProperty("nibModeBoundsWidthEraserSize")] + public double NibModeBoundsWidthEraserSize { get; set; } = 0.8; + + [JsonProperty("fingerModeBoundsWidthEraserSize")] + public double FingerModeBoundsWidthEraserSize { get; set; } = 0.8; + [JsonProperty("eraserBindTouchMultiplier")] public bool EraserBindTouchMultiplier { get; set; } From 75e7e3601186697cd2fa5f0a631d033081490394 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 14:31:38 +0800 Subject: [PATCH 018/101] improve:issue #133 --- Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index 24e0e73b..2d9971c4 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -590,8 +590,8 @@ namespace Ink_Canvas lastTouchDownTime = DateTime.Now; } - // Palm Eraser 逻辑 - if (Settings.Canvas.EnablePalmEraser && dec.Count >= 2 && !isPalmEraserActive) + // Palm Eraser 逻辑 + if (Settings.Canvas.EnablePalmEraser && !isPalmEraserActive) { touchPoint = e.GetTouchPoint(inkCanvas); double boundWidth = GetTouchBoundWidth(e); From 1ad64050036357ee2125ff42cab336df55a30971 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 14:49:40 +0800 Subject: [PATCH 019/101] improve:issue #197 --- Ink Canvas/Resources/TimerDownNotice.wav | Bin 233972 -> 294990 bytes Ink Canvas/Windows/CountdownTimerWindow.xaml | 25 ++++++++++--------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Ink Canvas/Resources/TimerDownNotice.wav b/Ink Canvas/Resources/TimerDownNotice.wav index c24d93ce9e8e5d2a05a65b812655cab955494c62..8bf3256dc904de2de7bc0dfd9dbe2e9616b3934f 100644 GIT binary patch literal 294990 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⪚+M~%7*ry0cthI@ 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�b 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�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 diff --git a/Ink Canvas/Windows/CountdownTimerWindow.xaml b/Ink Canvas/Windows/CountdownTimerWindow.xaml index 1a8bfe8e..6fed4d88 100644 --- a/Ink Canvas/Windows/CountdownTimerWindow.xaml +++ b/Ink Canvas/Windows/CountdownTimerWindow.xaml @@ -44,18 +44,18 @@ @@ -91,18 +91,18 @@ @@ -244,3 +244,4 @@ + From 4a0d13457ad1e3b52a3f8f7cc7f3f91b50d7f21d Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 20 Sep 2025 15:25:08 +0800 Subject: [PATCH 020/101] =?UTF-8?q?improve:=E6=9B=B4=E6=96=B0=E5=BC=B9?= =?UTF-8?q?=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas.sln.DotSettings.user | 4 +- Ink Canvas/Windows/HasNewUpdateWindow.xaml | 326 +++++++++++++++--- Ink Canvas/Windows/HasNewUpdateWindow.xaml.cs | 44 ++- 3 files changed, 325 insertions(+), 49 deletions(-) diff --git a/Ink Canvas.sln.DotSettings.user b/Ink Canvas.sln.DotSettings.user index 0401f804..21fc1f49 100644 --- a/Ink Canvas.sln.DotSettings.user +++ b/Ink Canvas.sln.DotSettings.user @@ -1,4 +1,6 @@  WARNING C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\MSBuild.exe - 1114112 \ No newline at end of file + 1114112 + True + True \ No newline at end of file diff --git a/Ink Canvas/Windows/HasNewUpdateWindow.xaml b/Ink Canvas/Windows/HasNewUpdateWindow.xaml index 61d8f5d9..dd2542ba 100644 --- a/Ink Canvas/Windows/HasNewUpdateWindow.xaml +++ b/Ink Canvas/Windows/HasNewUpdateWindow.xaml @@ -7,27 +7,218 @@ xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern" xmlns:mdxam="clr-namespace:MdXaml;assembly=MdXaml" mc:Ignorable="d" - ui:WindowHelper.UseModernWindowStyle = "True" + ui:WindowHelper.UseModernWindowStyle = "False" ui:WindowHelper.SystemBackdropType="Mica" - ui:TitleBar.Height="36" - Title="InkCanvasForClass CE有新版本可用" Height="600" Width="850" ResizeMode="NoResize" - WindowStartupLocation="CenterScreen"> + Title="InkCanvasForClass CE有新版本可用" Height="650" Width="900" ResizeMode="NoResize" + WindowStartupLocation="CenterScreen" WindowStyle="None" AllowsTransparency="True" + Background="#f8fafc"> + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + # InkCanvasForClass v5.0.2更新 你好,旅行者们,本次InkCanvasForClass Community Edition更新带来了如下新功能供您探索: @@ -42,48 +233,93 @@ 8. 带来了基于FitToCurve的笔迹平滑,基于贝塞尔曲线平滑,让墨迹线条更加优美好看。 + - - - - - + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + - + + + + - - + + - + - + - - @@ -1028,6 +1029,19 @@ FontSize="26" /> + + + + + + + + + @@ -4092,7 +4106,7 @@ - @@ -4100,7 +4114,7 @@ - @@ -4114,7 +4128,7 @@ Text="{Binding ElementName=TextBlockWhiteBoardIndexInfo, Path=Text}" Margin="0,-1,0,0" FontSize="17" FontWeight="Bold" TextAlignment="Center" /> - @@ -4122,7 +4136,7 @@ - @@ -4190,7 +4204,7 @@ - @@ -4208,14 +4222,14 @@ - - @@ -4245,17 +4259,17 @@ - @@ -4264,7 +4278,7 @@ - - @@ -4450,14 +4464,14 @@ - @@ -4473,14 +4487,14 @@ - @@ -4498,7 +4512,7 @@ @@ -4525,7 +4539,7 @@ Canvas.Left="9" Canvas.Right="9" Canvas.Bottom="0"> - @@ -5379,14 +5393,14 @@ - @@ -5403,7 +5417,7 @@ @@ -5599,7 +5613,7 @@ - @@ -5613,18 +5627,18 @@ - - - - @@ -5786,14 +5800,14 @@ - - @@ -5808,7 +5822,7 @@ - + @@ -5890,14 +5904,14 @@ - - + @@ -5907,14 +5921,14 @@ - - @@ -5934,14 +5948,14 @@ - - @@ -5957,7 +5971,7 @@ @@ -5993,7 +6007,7 @@ - @@ -6013,7 +6027,7 @@ - @@ -6033,7 +6047,7 @@ - @@ -6056,7 +6070,7 @@ - @@ -6076,7 +6090,7 @@ - @@ -6096,7 +6110,7 @@ - @@ -6119,7 +6133,7 @@ - @@ -6139,7 +6153,7 @@ - @@ -6159,7 +6173,7 @@ - @@ -6187,14 +6201,14 @@ - - @@ -6221,14 +6235,14 @@ - - @@ -6247,7 +6261,7 @@ - @@ -6255,7 +6269,7 @@ - @@ -6269,7 +6283,7 @@ Text="{Binding ElementName=TextBlockWhiteBoardIndexInfo, Path=Text}" Margin="0,-1,0,0" FontSize="17" FontWeight="Bold" TextAlignment="Center" /> - @@ -6277,7 +6291,7 @@ - @@ -6345,7 +6359,7 @@ - @@ -6448,10 +6462,10 @@ - + FontSize="16" Foreground="{DynamicResource SettingsPageForeground}" /> @@ -6869,7 +6883,7 @@ @@ -6877,9 +6891,9 @@ @@ -6911,7 +6925,7 @@ - @@ -6927,14 +6941,14 @@ - - @@ -7537,7 +7551,7 @@ - @@ -7562,7 +7576,7 @@ Canvas.Left="9" Canvas.Right="9" Canvas.Bottom="0"> + Background="{DynamicResource FloatBarBackground}" CornerRadius="1" /> @@ -7595,7 +7609,7 @@ Orientation="Horizontal" Canvas.Left="14" Canvas.Right="14" Canvas.Bottom="0"> + Background="{DynamicResource FloatBarBackground}" CornerRadius="1" /> @@ -7774,7 +7788,7 @@ Height="23" Margin="0,0,0,0" /> @@ -8341,7 +8355,7 @@ - - - - - @@ -8676,7 +8690,7 @@ - @@ -8685,7 +8699,7 @@ - @@ -8713,7 +8727,7 @@ - - @@ -8745,7 +8759,7 @@ - - - - @@ -8940,20 +8954,20 @@ - - - @@ -9006,7 +9020,7 @@ - @@ -9026,7 +9040,7 @@ - @@ -9049,7 +9063,7 @@ - @@ -9069,7 +9083,7 @@ - @@ -9089,7 +9103,7 @@ - @@ -9112,7 +9126,7 @@ - @@ -9132,7 +9146,7 @@ - @@ -9152,7 +9166,7 @@ - @@ -9175,7 +9189,7 @@ - @@ -9192,7 +9206,7 @@ - @@ -9337,7 +9351,7 @@ EditingMode="None" Background="Transparent" /> @@ -9481,7 +9495,7 @@ + Foreground="{DynamicResource FloatBarForeground}" Text="1.0x" VerticalAlignment="Center"> @@ -9503,7 +9517,7 @@ - - + - + - + - + - + - + - - + - + - + - + - + - + + /// 主题下拉框选择变化事件 + /// + private void ComboBoxTheme_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (!isLoaded) return; + + try + { + System.Windows.Controls.ComboBox comboBox = sender as System.Windows.Controls.ComboBox; + if (comboBox != null) + { + Settings.Appearance.Theme = comboBox.SelectedIndex; + + // 应用新主题 + ApplyTheme(comboBox.SelectedIndex); + + // 保存设置 + SaveSettingsToFile(); + + // 显示通知 + string themeName; + switch (comboBox.SelectedIndex) + { + case 0: + themeName = "浅色主题"; + break; + case 1: + themeName = "深色主题"; + break; + case 2: + themeName = "跟随系统"; + break; + default: + themeName = "未知主题"; + break; + } + + ShowNotification($"已切换到{themeName}"); + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"切换主题时出错: {ex.Message}", LogHelper.LogType.Error); + ShowNotification("主题切换失败"); + } + } + + /// + /// 应用指定主题 + /// + /// 主题索引:0-浅色,1-深色,2-跟随系统 + private void ApplyTheme(int themeIndex) + { + try + { + switch (themeIndex) + { + case 0: // 浅色主题 + SetTheme("Light"); + // 浅色主题下设置浮动栏为完全不透明 + ViewboxFloatingBar.Opacity = 1.0; + break; + case 1: // 深色主题 + SetTheme("Dark"); + // 深色主题下设置浮动栏为完全不透明 + ViewboxFloatingBar.Opacity = 1.0; + break; + case 2: // 跟随系统 + if (IsSystemThemeLight()) + { + SetTheme("Light"); + ViewboxFloatingBar.Opacity = 1.0; + } + else + { + SetTheme("Dark"); + ViewboxFloatingBar.Opacity = 1.0; + } + break; + } + + // 强制刷新通知框的颜色资源 + RefreshNotificationColors(); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"应用主题时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 刷新通知框的颜色资源 + /// + private void RefreshNotificationColors() + { + try + { + // 强制刷新通知框的背景和前景色 + var border = GridNotifications.Children.OfType().FirstOrDefault(); + if (border != null) + { + border.Background = (Brush)Application.Current.FindResource("SettingsPageBackground"); + border.BorderBrush = new SolidColorBrush(Color.FromRgb(185, 28, 28)); // 保持红色边框 + } + + TextBlockNotice.Foreground = (Brush)Application.Current.FindResource("SettingsPageForeground"); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"刷新通知框颜色时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + + #endregion } } diff --git a/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs b/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs index f908c2ad..132c7056 100644 --- a/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs +++ b/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs @@ -1,61 +1,92 @@ using iNKORE.UI.WPF.Modern; using Microsoft.Win32; using System; +using System.Collections.Generic; using System.Windows; using System.Windows.Media; +using Ink_Canvas.Helpers; using Application = System.Windows.Application; namespace Ink_Canvas { public partial class MainWindow : Window { - private Color FloatBarForegroundColor = Color.FromRgb(102, 102, 102); + private Color FloatBarForegroundColor; private void SetTheme(string theme) { + // 清理现有的主题资源 + var resourcesToRemove = new List(); + foreach (var dict in Application.Current.Resources.MergedDictionaries) + { + if (dict.Source != null && + (dict.Source.ToString().Contains("Light.xaml") || + dict.Source.ToString().Contains("Dark.xaml"))) + { + resourcesToRemove.Add(dict); + } + } + + foreach (var dict in resourcesToRemove) + { + Application.Current.Resources.MergedDictionaries.Remove(dict); + } + + // 先添加其他资源 + var rd2 = new ResourceDictionary + { Source = new Uri("Resources/DrawShapeImageDictionary.xaml", UriKind.Relative) }; + Application.Current.Resources.MergedDictionaries.Add(rd2); + + var rd3 = new ResourceDictionary + { Source = new Uri("Resources/SeewoImageDictionary.xaml", UriKind.Relative) }; + Application.Current.Resources.MergedDictionaries.Add(rd3); + + var rd4 = new ResourceDictionary + { Source = new Uri("Resources/IconImageDictionary.xaml", UriKind.Relative) }; + Application.Current.Resources.MergedDictionaries.Add(rd4); + if (theme == "Light") { var rd1 = new ResourceDictionary { Source = new Uri("Resources/Styles/Light.xaml", UriKind.Relative) }; Application.Current.Resources.MergedDictionaries.Add(rd1); - var rd2 = new ResourceDictionary - { Source = new Uri("Resources/DrawShapeImageDictionary.xaml", UriKind.Relative) }; - Application.Current.Resources.MergedDictionaries.Add(rd2); - - var rd3 = new ResourceDictionary - { Source = new Uri("Resources/SeewoImageDictionary.xaml", UriKind.Relative) }; - Application.Current.Resources.MergedDictionaries.Add(rd3); - - var rd4 = new ResourceDictionary - { Source = new Uri("Resources/IconImageDictionary.xaml", UriKind.Relative) }; - Application.Current.Resources.MergedDictionaries.Add(rd4); - ThemeManager.SetRequestedTheme(window, ElementTheme.Light); - FloatBarForegroundColor = (Color)Application.Current.FindResource("FloatBarForegroundColor"); + InitializeFloatBarForegroundColor(); + + // 强制刷新UI + window.InvalidateVisual(); } else if (theme == "Dark") { var rd1 = new ResourceDictionary { Source = new Uri("Resources/Styles/Dark.xaml", UriKind.Relative) }; Application.Current.Resources.MergedDictionaries.Add(rd1); - var rd2 = new ResourceDictionary - { Source = new Uri("Resources/DrawShapeImageDictionary.xaml", UriKind.Relative) }; - Application.Current.Resources.MergedDictionaries.Add(rd2); - - var rd3 = new ResourceDictionary - { Source = new Uri("Resources/SeewoImageDictionary.xaml", UriKind.Relative) }; - Application.Current.Resources.MergedDictionaries.Add(rd3); - - var rd4 = new ResourceDictionary - { Source = new Uri("Resources/IconImageDictionary.xaml", UriKind.Relative) }; - Application.Current.Resources.MergedDictionaries.Add(rd4); - ThemeManager.SetRequestedTheme(window, ElementTheme.Dark); + InitializeFloatBarForegroundColor(); + + // 强制刷新UI + window.InvalidateVisual(); + } + } + + /// + /// 初始化FloatBarForegroundColor,从当前主题资源中加载颜色 + /// + private void InitializeFloatBarForegroundColor() + { + try + { FloatBarForegroundColor = (Color)Application.Current.FindResource("FloatBarForegroundColor"); } + catch (Exception ex) + { + // 如果无法从资源中加载,使用默认颜色 + FloatBarForegroundColor = Color.FromRgb(0, 0, 0); + LogHelper.WriteLogToFile($"初始化FloatBarForegroundColor时出错: {ex.Message}", LogHelper.LogType.Error); + } } private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index a6df1ddd..31bb8798 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -404,17 +404,17 @@ namespace Ink_Canvas { if (mode != "clear") { - CursorIconGeometry.Brush = new SolidColorBrush(Color.FromRgb(27, 27, 27)); + CursorIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); CursorIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedCursorIcon); - PenIconGeometry.Brush = new SolidColorBrush(Color.FromRgb(27, 27, 27)); + PenIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); PenIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedPenIcon); - StrokeEraserIconGeometry.Brush = new SolidColorBrush(Color.FromRgb(27, 27, 27)); + StrokeEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); StrokeEraserIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedEraserStrokeIcon); - CircleEraserIconGeometry.Brush = new SolidColorBrush(Color.FromRgb(27, 27, 27)); + CircleEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); CircleEraserIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedEraserCircleIcon); - LassoSelectIconGeometry.Brush = new SolidColorBrush(Color.FromRgb(27, 27, 27)); + LassoSelectIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); LassoSelectIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedLassoSelectIcon); BoardPen.Background = new SolidColorBrush(Color.FromRgb(244, 244, 245)); diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index b2e29494..41b6a0fe 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -245,6 +245,9 @@ namespace Ink_Canvas break; } + // 设置主题下拉框 + ComboBoxTheme.SelectedIndex = Settings.Appearance.Theme; + ComboBoxChickenSoupSource.SelectedIndex = Settings.Appearance.ChickenSoupSource; ToggleSwitchEnableQuickPanel.IsOn = Settings.Appearance.IsShowQuickPanel; diff --git a/Ink Canvas/Resources/Styles/Dark.xaml b/Ink Canvas/Resources/Styles/Dark.xaml index 2dd756fc..1a7cfee4 100644 --- a/Ink Canvas/Resources/Styles/Dark.xaml +++ b/Ink Canvas/Resources/Styles/Dark.xaml @@ -1,7 +1,23 @@ - - - - + + + + + + #FFcccccc + + + + + + + + + + + + + Transparent + #2200CDCD + #4400CDCD \ No newline at end of file diff --git a/Ink Canvas/Resources/Styles/Light.xaml b/Ink Canvas/Resources/Styles/Light.xaml index 900ceccf..5413bc30 100644 --- a/Ink Canvas/Resources/Styles/Light.xaml +++ b/Ink Canvas/Resources/Styles/Light.xaml @@ -1,7 +1,23 @@ - - - - - #18181b + + + + + + + #FF000000 + + + + + + + + + + + + + Transparent + #66FFFFFF + #99FFFFFF \ No newline at end of file From d67172b7952761282d4f3f0b93bb8d575fba991f Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 21 Sep 2025 00:28:30 +0800 Subject: [PATCH 042/101] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/FloatingWindowInterceptorManager.cs | 1 - Ink Canvas/Helpers/FloatingWindowInterceptor.cs | 1 - Ink Canvas/Helpers/MultiPPTInkManager.cs | 1 - Ink Canvas/Helpers/ScreenDetectionHelper.cs | 1 - Ink Canvas/MainWindow_cs/MW_FloatingWindowInterceptor.cs | 1 - Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 1 - Ink Canvas/Windows/HistoryRollbackWindow.xaml.cs | 1 - 7 files changed, 7 deletions(-) diff --git a/Ink Canvas/FloatingWindowInterceptorManager.cs b/Ink Canvas/FloatingWindowInterceptorManager.cs index 2c505220..9abd6a00 100644 --- a/Ink Canvas/FloatingWindowInterceptorManager.cs +++ b/Ink Canvas/FloatingWindowInterceptorManager.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Windows; using Ink_Canvas.Helpers; namespace Ink_Canvas diff --git a/Ink Canvas/Helpers/FloatingWindowInterceptor.cs b/Ink Canvas/Helpers/FloatingWindowInterceptor.cs index 5d401a71..9c74c857 100644 --- a/Ink Canvas/Helpers/FloatingWindowInterceptor.cs +++ b/Ink Canvas/Helpers/FloatingWindowInterceptor.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; -using System.Threading.Tasks; using System.Windows.Threading; namespace Ink_Canvas.Helpers diff --git a/Ink Canvas/Helpers/MultiPPTInkManager.cs b/Ink Canvas/Helpers/MultiPPTInkManager.cs index 29228802..64d99620 100644 --- a/Ink Canvas/Helpers/MultiPPTInkManager.cs +++ b/Ink Canvas/Helpers/MultiPPTInkManager.cs @@ -1,7 +1,6 @@ using Microsoft.Office.Interop.PowerPoint; using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Security.Cryptography; diff --git a/Ink Canvas/Helpers/ScreenDetectionHelper.cs b/Ink Canvas/Helpers/ScreenDetectionHelper.cs index bf23dc8a..5d048a7f 100644 --- a/Ink Canvas/Helpers/ScreenDetectionHelper.cs +++ b/Ink Canvas/Helpers/ScreenDetectionHelper.cs @@ -1,6 +1,5 @@ using System; using System.Drawing; -using System.Linq; using System.Windows; using System.Windows.Forms; using System.Windows.Interop; diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingWindowInterceptor.cs b/Ink Canvas/MainWindow_cs/MW_FloatingWindowInterceptor.cs index c0e0fd4f..1df2cdf7 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingWindowInterceptor.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingWindowInterceptor.cs @@ -3,7 +3,6 @@ using iNKORE.UI.WPF.Modern.Controls; using System; using System.Linq; using System.Windows; -using System.Windows.Controls; namespace Ink_Canvas { diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index 2d9971c4..117a598a 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -9,7 +9,6 @@ using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; -using System.Windows.Threading; using Point = System.Windows.Point; namespace Ink_Canvas diff --git a/Ink Canvas/Windows/HistoryRollbackWindow.xaml.cs b/Ink Canvas/Windows/HistoryRollbackWindow.xaml.cs index 1e357f13..cd1668ac 100644 --- a/Ink Canvas/Windows/HistoryRollbackWindow.xaml.cs +++ b/Ink Canvas/Windows/HistoryRollbackWindow.xaml.cs @@ -8,7 +8,6 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; -using System.Windows.Interop; // Added for OrderByDescending From beebfb0daeabd102101aa9f63575d235b286dd99 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 21 Sep 2025 00:39:30 +0800 Subject: [PATCH 043/101] =?UTF-8?q?add:=E4=B8=BB=E9=A2=98=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_AutoTheme.cs | 71 +++++++++++++++++++++++- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs b/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs index 132c7056..20d7bc9b 100644 --- a/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs +++ b/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Windows; using System.Windows.Media; -using Ink_Canvas.Helpers; using Application = System.Windows.Application; namespace Ink_Canvas @@ -80,12 +79,78 @@ namespace Ink_Canvas try { FloatBarForegroundColor = (Color)Application.Current.FindResource("FloatBarForegroundColor"); + + // 强制刷新浮动工具栏按钮颜色 + RefreshFloatingBarButtonColors(); } - catch (Exception ex) + catch (Exception) { // 如果无法从资源中加载,使用默认颜色 FloatBarForegroundColor = Color.FromRgb(0, 0, 0); - LogHelper.WriteLogToFile($"初始化FloatBarForegroundColor时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 刷新浮动工具栏按钮颜色 + /// + private void RefreshFloatingBarButtonColors() + { + try + { + // 选中状态的颜色(蓝底) + var selectedColor = Color.FromRgb(30, 58, 138); + + // 根据当前模式设置按钮颜色 + switch (_currentToolMode) + { + case "cursor": + CursorIconGeometry.Brush = new SolidColorBrush(selectedColor); + PenIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + StrokeEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + CircleEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + LassoSelectIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + break; + case "pen": + case "color": + CursorIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + PenIconGeometry.Brush = new SolidColorBrush(selectedColor); + StrokeEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + CircleEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + LassoSelectIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + break; + case "eraser": + CursorIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + PenIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + StrokeEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + CircleEraserIconGeometry.Brush = new SolidColorBrush(selectedColor); + LassoSelectIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + break; + case "eraserByStrokes": + CursorIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + PenIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + StrokeEraserIconGeometry.Brush = new SolidColorBrush(selectedColor); + CircleEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + LassoSelectIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + break; + case "select": + CursorIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + PenIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + StrokeEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + CircleEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + LassoSelectIconGeometry.Brush = new SolidColorBrush(selectedColor); + break; + default: + // 默认情况,所有按钮都使用主题颜色 + CursorIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + PenIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + StrokeEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + CircleEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + LassoSelectIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); + break; + } + } + catch (Exception) + { } } From c4d2b15c48992f592b223609c0665fa91701c79c Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 21 Sep 2025 01:06:42 +0800 Subject: [PATCH 044/101] =?UTF-8?q?add:=E4=B8=BB=E9=A2=98=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 42 +++++++++--------- Ink Canvas/Resources/Styles/Dark.xaml | 4 ++ Ink Canvas/Resources/Styles/Light.xaml | 4 ++ ...vasForClass.csproj.AssemblyReference.cache | Bin 38181 -> 38044 bytes 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 73e81646..2bc47e8c 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -4091,13 +4091,13 @@ - + - @@ -4187,8 +4187,8 @@ + BorderThickness="0,1,1,1" BorderBrush="{DynamicResource BoardFloatBarBorderBrush}" + Background="{DynamicResource BoardFloatBarBackground}" Opacity="0.95"> @@ -4212,8 +4212,8 @@ - + + Background="{DynamicResource BoardFloatBarBackground}" + Opacity="1" BorderThickness="1,1,0,1" BorderBrush="{DynamicResource BoardFloatBarBorderBrush}"> @@ -6225,8 +6225,8 @@ HorizontalAlignment="Center" VerticalAlignment="Bottom"> - + - @@ -6342,8 +6342,8 @@ + BorderThickness="0,1,1,1" BorderBrush="{DynamicResource BoardFloatBarBorderBrush}" + Background="{DynamicResource BoardFloatBarBackground}" Opacity="0.95"> diff --git a/Ink Canvas/Resources/Styles/Dark.xaml b/Ink Canvas/Resources/Styles/Dark.xaml index 1a7cfee4..a7c7e39c 100644 --- a/Ink Canvas/Resources/Styles/Dark.xaml +++ b/Ink Canvas/Resources/Styles/Dark.xaml @@ -20,4 +20,8 @@ Transparent #2200CDCD #4400CDCD + + + + \ No newline at end of file diff --git a/Ink Canvas/Resources/Styles/Light.xaml b/Ink Canvas/Resources/Styles/Light.xaml index 5413bc30..9b46dc1c 100644 --- a/Ink Canvas/Resources/Styles/Light.xaml +++ b/Ink Canvas/Resources/Styles/Light.xaml @@ -20,4 +20,8 @@ Transparent #66FFFFFF #99FFFFFF + + + + \ No newline at end of file diff --git a/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.AssemblyReference.cache b/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.AssemblyReference.cache index 57d842b8b7d92d5308ee26301638a87ff9085d80..c8c2dfbd497b829755ee6211820ad2e2d43c9d13 100644 GIT binary patch delta 23 fcmZ3wifPVDCJr`6Lk0#0#>B~nPN5rP?WX_$OSlGi delta 70 zcmbQUl4B~nPN5rP?War*kO`k`FUd8TkDE=&SuZ6ghmjGefZ>7T XjqeIqIY4T;%1rbO^o$LR4J{b}mk1Gb From 1957288219e25e31a9b1a04fc1b1c9590583dfaa Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 21 Sep 2025 01:15:01 +0800 Subject: [PATCH 045/101] =?UTF-8?q?add:=E4=B8=BB=E9=A2=98=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 42 +++++++++--------- ...vasForClass.csproj.AssemblyReference.cache | Bin 38044 -> 38181 bytes 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 2bc47e8c..e5634dce 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -4426,8 +4426,8 @@ + Background="{DynamicResource BoardFloatBarBackground}" Opacity="1" BorderThickness="0,1,1,1" + BorderBrush="{DynamicResource BoardFloatBarBorderBrush}"> @@ -4449,12 +4449,12 @@ - + + BorderThickness="0,1,0,1" BorderBrush="{DynamicResource BoardFloatBarBorderBrush}" + MouseUp="PenIcon_Click" Background="{DynamicResource BoardFloatBarBackground}" Opacity="0.95"> @@ -5383,8 +5383,8 @@ + BorderThickness="0,1,1,1" BorderBrush="{DynamicResource BoardFloatBarBorderBrush}" + MouseUp="BoardEraserIcon_Click" Background="{DynamicResource BoardFloatBarBackground}" Opacity="0.95"> @@ -5607,7 +5607,7 @@ + BorderThickness="0,1,1,1" BorderBrush="{DynamicResource BoardFloatBarBorderBrush}" + MouseUp="ImageDrawShape_MouseUp" Background="{DynamicResource BoardFloatBarBackground}" Opacity="0.95"> @@ -5791,8 +5791,8 @@ + BorderThickness="0,1,0,1" BorderBrush="{DynamicResource BoardFloatBarBorderBrush}" + MouseUp="InsertImageOptions_MouseUp" Background="{DynamicResource BoardFloatBarBackground}" Opacity="0.95"> @@ -5896,7 +5896,7 @@ - + @@ -5914,7 +5914,7 @@ - + @@ -5935,11 +5935,11 @@ - + + BorderBrush="{DynamicResource BoardFloatBarBorderBrush}"> diff --git a/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.AssemblyReference.cache b/Ink Canvas/obj/Debug/net472/InkCanvasForClass.csproj.AssemblyReference.cache index c8c2dfbd497b829755ee6211820ad2e2d43c9d13..57d842b8b7d92d5308ee26301638a87ff9085d80 100644 GIT binary patch delta 70 zcmbQUl4B~nPN5rP?War*kO`k`FUd8TkDE=&SuZ6ghmjGefZ>7T XjqeIqIY4T;%1rbO^o$LR4J{b}mk1Gb delta 23 fcmZ3wifPVDCJr`6Lk0#0#>B~nPN5rP?WX_$OSlGi From 7c8281eb00b392e39b75e8bd79e53ac4237dab4e Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 21 Sep 2025 01:35:13 +0800 Subject: [PATCH 046/101] =?UTF-8?q?add:=E4=B8=BB=E9=A2=98=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 10 +++++----- Ink Canvas/Resources/Styles/Dark.xaml | 5 +++++ Ink Canvas/Resources/Styles/Light.xaml | 5 +++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index e5634dce..6d897183 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -4136,7 +4136,7 @@ diff --git a/Ink Canvas/Resources/Styles/Dark.xaml b/Ink Canvas/Resources/Styles/Dark.xaml index a7c7e39c..e04f7855 100644 --- a/Ink Canvas/Resources/Styles/Dark.xaml +++ b/Ink Canvas/Resources/Styles/Dark.xaml @@ -24,4 +24,9 @@ + + + + + \ No newline at end of file diff --git a/Ink Canvas/Resources/Styles/Light.xaml b/Ink Canvas/Resources/Styles/Light.xaml index 9b46dc1c..bcf1db1f 100644 --- a/Ink Canvas/Resources/Styles/Light.xaml +++ b/Ink Canvas/Resources/Styles/Light.xaml @@ -24,4 +24,9 @@ + + + + + \ No newline at end of file From 0cb4749cf3f3dc4b855edac02503485cba19fbe7 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 21 Sep 2025 02:05:49 +0800 Subject: [PATCH 047/101] =?UTF-8?q?add:=E4=B8=BB=E9=A2=98=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 2 +- Ink Canvas/MainWindow_cs/MW_AutoTheme.cs | 39 ++++--- .../MainWindow_cs/MW_FloatingBarIcons.cs | 106 +++++++++++++----- 3 files changed, 107 insertions(+), 40 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 6d897183..614d5a16 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -6291,7 +6291,7 @@ Date: Sun, 21 Sep 2025 02:08:29 +0800 Subject: [PATCH 048/101] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/AssemblyInfo.cs | 4 ++-- Ink Canvas/Properties/AssemblyInfo.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Ink Canvas/AssemblyInfo.cs b/Ink Canvas/AssemblyInfo.cs index f9735752..f87d71c3 100644 --- a/Ink Canvas/AssemblyInfo.cs +++ b/Ink Canvas/AssemblyInfo.cs @@ -49,5 +49,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.11.1")] -[assembly: AssemblyFileVersion("1.7.11.1")] +[assembly: AssemblyVersion("1.7.11.2")] +[assembly: AssemblyFileVersion("1.7.11.2")] diff --git a/Ink Canvas/Properties/AssemblyInfo.cs b/Ink Canvas/Properties/AssemblyInfo.cs index f9735752..f87d71c3 100644 --- a/Ink Canvas/Properties/AssemblyInfo.cs +++ b/Ink Canvas/Properties/AssemblyInfo.cs @@ -49,5 +49,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.11.1")] -[assembly: AssemblyFileVersion("1.7.11.1")] +[assembly: AssemblyVersion("1.7.11.2")] +[assembly: AssemblyFileVersion("1.7.11.2")] From 04ef638e17a3e6417dbd1a27d90c40ab37e7b9b1 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 21 Sep 2025 07:43:29 +0800 Subject: [PATCH 049/101] fix:issue #190 --- Ink Canvas/Helpers/MultiPPTInkManager.cs | 2 +- Ink Canvas/Helpers/PPTInkManager.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Ink Canvas/Helpers/MultiPPTInkManager.cs b/Ink Canvas/Helpers/MultiPPTInkManager.cs index 64d99620..ec30d31d 100644 --- a/Ink Canvas/Helpers/MultiPPTInkManager.cs +++ b/Ink Canvas/Helpers/MultiPPTInkManager.cs @@ -561,7 +561,7 @@ namespace Ink_Canvas.Helpers var presentationPath = presentation.FullName; var fileHash = GetFileHash(presentationPath); var processId = GetProcessId(presentation); - return $"{presentation.Name}_{fileHash}_{processId}"; + return $"{presentation.Name}_{presentation.Slides.Count}_{fileHash}_{processId}"; } catch (COMException comEx) { diff --git a/Ink Canvas/Helpers/PPTInkManager.cs b/Ink Canvas/Helpers/PPTInkManager.cs index 0776e827..93b0a4dc 100644 --- a/Ink Canvas/Helpers/PPTInkManager.cs +++ b/Ink Canvas/Helpers/PPTInkManager.cs @@ -456,7 +456,7 @@ namespace Ink_Canvas.Helpers { var presentationPath = presentation.FullName; var fileHash = GetFileHash(presentationPath); - return $"{presentation.Name}_{fileHash}"; + return $"{presentation.Name}_{presentation.Slides.Count}_{fileHash}"; } catch (Exception ex) { From 630b4edf916d0d463dc3362d712f14e2725199f5 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 21 Sep 2025 07:52:11 +0800 Subject: [PATCH 050/101] =?UTF-8?q?improve:PPT=E5=A2=A8=E8=BF=B9=E4=BF=9D?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/MultiPPTInkManager.cs | 164 +++++++++++++++++++++- Ink Canvas/Helpers/PPTInkManager.cs | 167 +++++++++++++++++++++-- Ink Canvas/Helpers/PPTManager.cs | 81 +++++------ 3 files changed, 350 insertions(+), 62 deletions(-) diff --git a/Ink Canvas/Helpers/MultiPPTInkManager.cs b/Ink Canvas/Helpers/MultiPPTInkManager.cs index ec30d31d..96b618ed 100644 --- a/Ink Canvas/Helpers/MultiPPTInkManager.cs +++ b/Ink Canvas/Helpers/MultiPPTInkManager.cs @@ -26,6 +26,11 @@ namespace Ink_Canvas.Helpers private readonly object _lockObject = new object(); private bool _disposed; private string _currentActivePresentationId = ""; + + // 墨迹备份机制 + private readonly Dictionary> _strokeBackups; + private DateTime _lastBackupTime = DateTime.MinValue; + private const int BackupIntervalMinutes = 2; // 每2分钟备份一次 #endregion #region Constructor @@ -33,6 +38,7 @@ namespace Ink_Canvas.Helpers { _presentationManagers = new Dictionary(); _presentationInfos = new Dictionary(); + _strokeBackups = new Dictionary>(); } #endregion @@ -112,8 +118,15 @@ namespace Ink_Canvas.Helpers var currentPresentation = GetCurrentActivePresentation(); if (currentPresentation != null) { - currentManager.SaveAllStrokesToFile(currentPresentation); - LogHelper.WriteLogToFile($"已保存当前演示文稿墨迹: {currentPresentation.Name}", LogHelper.LogType.Trace); + try + { + currentManager.SaveAllStrokesToFile(currentPresentation); + LogHelper.WriteLogToFile($"已保存当前演示文稿墨迹: {currentPresentation.Name}", LogHelper.LogType.Trace); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"保存当前演示文稿墨迹失败: {ex}", LogHelper.LogType.Error); + } } } } @@ -126,10 +139,10 @@ namespace Ink_Canvas.Helpers _presentationInfos[presentationId].LastAccessTime = DateTime.Now; } - if (_currentActivePresentationId != presentationId) - { - LogHelper.WriteLogToFile($"已切换到演示文稿: {presentation.Name}", LogHelper.LogType.Trace); - } + if (_currentActivePresentationId != presentationId) + { + LogHelper.WriteLogToFile($"已切换到演示文稿: {presentation.Name}", LogHelper.LogType.Trace); + } return true; } else @@ -161,7 +174,17 @@ namespace Ink_Canvas.Helpers var manager = GetCurrentManager(); if (manager != null) { + // 先创建备份 + if (!string.IsNullOrEmpty(_currentActivePresentationId)) + { + CreateStrokeBackup(_currentActivePresentationId, slideIndex, strokes); + } + + // 保存到管理器 manager.SaveCurrentSlideStrokes(slideIndex, strokes); + + // 检查是否需要执行定期备份 + CheckAndPerformBackup(); } } catch (Exception ex) @@ -209,12 +232,29 @@ namespace Ink_Canvas.Helpers var manager = GetCurrentManager(); if (manager != null) { - return manager.LoadSlideStrokes(slideIndex); + var strokes = manager.LoadSlideStrokes(slideIndex); + + // 如果从管理器加载失败,尝试从备份恢复 + if (strokes == null || strokes.Count == 0) + { + if (!string.IsNullOrEmpty(_currentActivePresentationId)) + { + strokes = RestoreStrokeFromBackup(_currentActivePresentationId, slideIndex); + } + } + + return strokes ?? new StrokeCollection(); } } catch (Exception ex) { LogHelper.WriteLogToFile($"加载页面墨迹失败: {ex}", LogHelper.LogType.Error); + + // 尝试从备份恢复 + if (!string.IsNullOrEmpty(_currentActivePresentationId)) + { + return RestoreStrokeFromBackup(_currentActivePresentationId, slideIndex); + } } } @@ -511,6 +551,12 @@ namespace Ink_Canvas.Helpers } _presentationInfos.Remove(id); + // 清理备份数据 + if (_strokeBackups.ContainsKey(id)) + { + _strokeBackups.Remove(id); + } + LogHelper.WriteLogToFile($"已清理非活跃演示文稿: {id}", LogHelper.LogType.Trace); } } @@ -520,6 +566,98 @@ namespace Ink_Canvas.Helpers } } } + + /// + /// 创建墨迹备份 + /// + private void CreateStrokeBackup(string presentationId, int slideIndex, StrokeCollection strokes) + { + try + { + if (strokes == null || strokes.Count == 0) return; + + if (!_strokeBackups.ContainsKey(presentationId)) + { + _strokeBackups[presentationId] = new Dictionary(); + } + + // 释放旧的备份 + if (_strokeBackups[presentationId].ContainsKey(slideIndex)) + { + _strokeBackups[presentationId][slideIndex] = null; + } + + // 创建新的备份 + _strokeBackups[presentationId][slideIndex] = strokes.Clone(); + + LogHelper.WriteLogToFile($"已创建第{slideIndex}页墨迹备份", LogHelper.LogType.Trace); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"创建墨迹备份失败: {ex}", LogHelper.LogType.Error); + } + } + + /// + /// 从备份恢复墨迹 + /// + private StrokeCollection RestoreStrokeFromBackup(string presentationId, int slideIndex) + { + try + { + if (_strokeBackups.ContainsKey(presentationId) && + _strokeBackups[presentationId].ContainsKey(slideIndex)) + { + var backup = _strokeBackups[presentationId][slideIndex]; + if (backup != null) + { + LogHelper.WriteLogToFile($"从备份恢复第{slideIndex}页墨迹", LogHelper.LogType.Trace); + return backup.Clone(); + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"从备份恢复墨迹失败: {ex}", LogHelper.LogType.Error); + } + + return new StrokeCollection(); + } + + /// + /// 检查并执行定期备份 + /// + private void CheckAndPerformBackup() + { + try + { + var now = DateTime.Now; + + // 检查是否需要执行备份 + if (now - _lastBackupTime < TimeSpan.FromMinutes(BackupIntervalMinutes)) + { + return; + } + + // 备份当前活跃演示文稿的所有墨迹 + if (!string.IsNullOrEmpty(_currentActivePresentationId) && + _presentationManagers.ContainsKey(_currentActivePresentationId)) + { + var manager = _presentationManagers[_currentActivePresentationId]; + if (manager != null) + { + // 这里可以添加更详细的备份逻辑 + LogHelper.WriteLogToFile($"执行定期墨迹备份: {_currentActivePresentationId}", LogHelper.LogType.Trace); + } + } + + _lastBackupTime = now; + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"定期备份检查失败: {ex}", LogHelper.LogType.Error); + } + } #endregion #region Private Methods @@ -637,12 +775,24 @@ namespace Ink_Canvas.Helpers { lock (_lockObject) { + // 释放所有管理器 foreach (var manager in _presentationManagers.Values) { manager?.Dispose(); } _presentationManagers.Clear(); _presentationInfos.Clear(); + + // 清理备份数据 + foreach (var backupDict in _strokeBackups.Values) + { + foreach (var backup in backupDict.Values) + { + backup?.Clear(); + } + backupDict.Clear(); + } + _strokeBackups.Clear(); } _disposed = true; } diff --git a/Ink Canvas/Helpers/PPTInkManager.cs b/Ink Canvas/Helpers/PPTInkManager.cs index 93b0a4dc..7e8afb22 100644 --- a/Ink Canvas/Helpers/PPTInkManager.cs +++ b/Ink Canvas/Helpers/PPTInkManager.cs @@ -35,6 +35,12 @@ namespace Ink_Canvas.Helpers private DateTime _lastSwitchTime = DateTime.MinValue; private int _lastSwitchSlideIndex = -1; private const int MinSwitchIntervalMs = 100; // 最小切换间隔100毫秒 + + // 内存管理相关字段 + private long _totalMemoryUsage = 0; + private const long MaxMemoryUsageBytes = 100 * 1024 * 1024; // 100MB限制 + private DateTime _lastMemoryCleanup = DateTime.MinValue; + private const int MemoryCleanupIntervalMinutes = 5; // 5分钟清理一次 #endregion #region Constructor @@ -125,17 +131,29 @@ namespace Ink_Canvas.Helpers if (slideIndex < _memoryStreams.Length) { + // 先释放旧的内存流,防止内存泄漏 + try + { + _memoryStreams[slideIndex]?.Dispose(); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"释放旧内存流失败: {ex}", LogHelper.LogType.Warning); + } + + // 创建新的内存流 var ms = new MemoryStream(); strokes.Save(ms); ms.Position = 0; - - // 释放旧的内存流 - _memoryStreams[slideIndex]?.Dispose(); _memoryStreams[slideIndex] = ms; if (ms.Length > 0) { + LogHelper.WriteLogToFile($"已保存第{slideIndex}页墨迹,大小: {ms.Length} bytes", LogHelper.LogType.Trace); } + + // 检查内存使用情况 + CheckAndPerformMemoryCleanup(); } } catch (Exception ex) @@ -158,12 +176,20 @@ namespace Ink_Canvas.Helpers { if (slideIndex < _memoryStreams.Length) { + // 先释放旧的内存流,防止内存泄漏 + try + { + _memoryStreams[slideIndex]?.Dispose(); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"释放旧内存流失败: {ex}", LogHelper.LogType.Warning); + } + + // 创建新的内存流 var ms = new MemoryStream(); strokes.Save(ms); ms.Position = 0; - - // 释放旧的内存流 - _memoryStreams[slideIndex]?.Dispose(); _memoryStreams[slideIndex] = ms; LogHelper.WriteLogToFile($"已强制保存第{slideIndex}页墨迹,大小: {ms.Length} bytes", LogHelper.LogType.Trace); @@ -388,13 +414,30 @@ namespace Ink_Canvas.Helpers { try { - for (int i = 0; i < _memoryStreams.Length; i++) + // 安全释放所有内存流 + if (_memoryStreams != null) { - _memoryStreams[i]?.Dispose(); - _memoryStreams[i] = null; + for (int i = 0; i < _memoryStreams.Length; i++) + { + try + { + _memoryStreams[i]?.Dispose(); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"释放内存流{i}失败: {ex}", LogHelper.LogType.Warning); + } + finally + { + _memoryStreams[i] = null; + } + } + + // 重新初始化数组 + _memoryStreams = new MemoryStream[_maxSlides + 2]; } - CurrentStrokes.Clear(); + CurrentStrokes?.Clear(); LogHelper.WriteLogToFile("已清除所有墨迹", LogHelper.LogType.Trace); } catch (Exception ex) @@ -447,6 +490,110 @@ namespace Ink_Canvas.Helpers _lastSwitchSlideIndex = -1; } } + + /// + /// 检查并执行内存清理 + /// + private void CheckAndPerformMemoryCleanup() + { + try + { + var now = DateTime.Now; + + // 检查是否需要执行内存清理 + if (now - _lastMemoryCleanup < TimeSpan.FromMinutes(MemoryCleanupIntervalMinutes)) + { + return; + } + + // 计算当前内存使用量 + long currentMemoryUsage = 0; + if (_memoryStreams != null) + { + for (int i = 0; i < _memoryStreams.Length; i++) + { + if (_memoryStreams[i] != null) + { + currentMemoryUsage += _memoryStreams[i].Length; + } + } + } + + _totalMemoryUsage = currentMemoryUsage; + + // 如果内存使用量超过限制,执行清理 + if (currentMemoryUsage > MaxMemoryUsageBytes) + { + LogHelper.WriteLogToFile($"内存使用量超限 ({currentMemoryUsage / 1024 / 1024}MB),开始清理", LogHelper.LogType.Warning); + + // 清理非当前页面的墨迹 + CleanupInactiveSlideStrokes(); + + _lastMemoryCleanup = now; + LogHelper.WriteLogToFile($"内存清理完成,当前使用量: {_totalMemoryUsage / 1024 / 1024}MB", LogHelper.LogType.Trace); + } + else + { + _lastMemoryCleanup = now; + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"内存清理检查失败: {ex}", LogHelper.LogType.Error); + } + } + + /// + /// 清理非活跃页面的墨迹 + /// + private void CleanupInactiveSlideStrokes() + { + try + { + if (_memoryStreams == null) return; + + int cleanedCount = 0; + long freedMemory = 0; + + for (int i = 0; i < _memoryStreams.Length; i++) + { + // 保留当前锁定页面和最近访问的页面 + if (i == _lockedSlideIndex || i == _lastSwitchSlideIndex) + { + continue; + } + + if (_memoryStreams[i] != null) + { + long memorySize = _memoryStreams[i].Length; + + try + { + _memoryStreams[i].Dispose(); + freedMemory += memorySize; + cleanedCount++; + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"清理页面{i}墨迹失败: {ex}", LogHelper.LogType.Warning); + } + finally + { + _memoryStreams[i] = null; + } + } + } + + if (cleanedCount > 0) + { + LogHelper.WriteLogToFile($"已清理{cleanedCount}个页面的墨迹,释放内存: {freedMemory / 1024}KB", LogHelper.LogType.Trace); + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"清理非活跃页面墨迹失败: {ex}", LogHelper.LogType.Error); + } + } #endregion #region Private Methods diff --git a/Ink Canvas/Helpers/PPTManager.cs b/Ink Canvas/Helpers/PPTManager.cs index ecca9519..c638914b 100644 --- a/Ink Canvas/Helpers/PPTManager.cs +++ b/Ink Canvas/Helpers/PPTManager.cs @@ -411,63 +411,30 @@ namespace Ink_Canvas.Helpers catch (COMException comEx) { var hr = (uint)comEx.HResult; + LogHelper.WriteLogToFile($"取消PPT事件注册时COM异常: {comEx.Message} (HR: 0x{hr:X8})", LogHelper.LogType.Warning); } catch (InvalidCastException) { // COM对象类型转换失败,通常是因为对象已经被释放 LogHelper.WriteLogToFile("PPT COM对象已被释放,跳过事件注册取消", LogHelper.LogType.Trace); } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"取消PPT事件注册时发生异常: {ex}", LogHelper.LogType.Warning); + } }, DispatcherPriority.Normal, CancellationToken.None, TimeSpan.FromSeconds(1)); } } - catch (Exception) + catch (Exception ex) { + LogHelper.WriteLogToFile($"取消PPT事件注册失败: {ex}", LogHelper.LogType.Warning); } - // 释放COM对象 - try - { - if (Marshal.IsComObject(CurrentSlide)) - { - Marshal.ReleaseComObject(CurrentSlide); - } - } - catch (Exception) - { - } - - try - { - if (Marshal.IsComObject(CurrentSlides)) - { - Marshal.ReleaseComObject(CurrentSlides); - } - } - catch (Exception) - { - } - - try - { - if (Marshal.IsComObject(CurrentPresentation)) - { - Marshal.ReleaseComObject(CurrentPresentation); - } - } - catch (Exception) - { - } - - try - { - if (Marshal.IsComObject(PPTApplication)) - { - Marshal.ReleaseComObject(PPTApplication); - } - } - catch (Exception) - { - } + // 安全释放COM对象 + SafeReleaseComObject(CurrentSlide, "CurrentSlide"); + SafeReleaseComObject(CurrentSlides, "CurrentSlides"); + SafeReleaseComObject(CurrentPresentation, "CurrentPresentation"); + SafeReleaseComObject(PPTApplication, "PPTApplication"); // 清理引用 PPTApplication = null; @@ -491,6 +458,30 @@ namespace Ink_Canvas.Helpers } } + /// + /// 安全释放COM对象 + /// + private void SafeReleaseComObject(object comObject, string objectName) + { + try + { + if (comObject != null && Marshal.IsComObject(comObject)) + { + int refCount = Marshal.ReleaseComObject(comObject); + LogHelper.WriteLogToFile($"已释放COM对象 {objectName},引用计数: {refCount}", LogHelper.LogType.Trace); + } + } + catch (COMException comEx) + { + var hr = (uint)comEx.HResult; + LogHelper.WriteLogToFile($"释放COM对象 {objectName} 时COM异常: {comEx.Message} (HR: 0x{hr:X8})", LogHelper.LogType.Warning); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"释放COM对象 {objectName} 时发生异常: {ex}", LogHelper.LogType.Warning); + } + } + private void UpdateCurrentPresentationInfo() { try From e9c20255a6344c9d41e0af67153aeca031f32ab8 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 21 Sep 2025 08:26:55 +0800 Subject: [PATCH 051/101] =?UTF-8?q?imporve:PPT=E5=A2=A8=E8=BF=B9=E4=BF=9D?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/MultiPPTInkManager.cs | 8 ++--- Ink Canvas/Helpers/PPTInkManager.cs | 7 ++++ Ink Canvas/Helpers/PPTManager.cs | 20 +++++++++-- Ink Canvas/MainWindow_cs/MW_PPT.cs | 42 +++++++++++++++++++++--- 4 files changed, 66 insertions(+), 11 deletions(-) diff --git a/Ink Canvas/Helpers/MultiPPTInkManager.cs b/Ink Canvas/Helpers/MultiPPTInkManager.cs index 96b618ed..67e4d3cb 100644 --- a/Ink Canvas/Helpers/MultiPPTInkManager.cs +++ b/Ink Canvas/Helpers/MultiPPTInkManager.cs @@ -174,14 +174,14 @@ namespace Ink_Canvas.Helpers var manager = GetCurrentManager(); if (manager != null) { - // 先创建备份 + // 保存到管理器 + manager.SaveCurrentSlideStrokes(slideIndex, strokes); + + // 只有在保存成功后才创建备份 if (!string.IsNullOrEmpty(_currentActivePresentationId)) { CreateStrokeBackup(_currentActivePresentationId, slideIndex, strokes); } - - // 保存到管理器 - manager.SaveCurrentSlideStrokes(slideIndex, strokes); // 检查是否需要执行定期备份 CheckAndPerformBackup(); diff --git a/Ink Canvas/Helpers/PPTInkManager.cs b/Ink Canvas/Helpers/PPTInkManager.cs index 7e8afb22..9d02c79c 100644 --- a/Ink Canvas/Helpers/PPTInkManager.cs +++ b/Ink Canvas/Helpers/PPTInkManager.cs @@ -473,6 +473,13 @@ namespace Ink_Canvas.Helpers return true; } + // 如果当前页面不是锁定页面,但锁定时间很短(小于50ms),允许写入 + // 这样可以确保旧页面的墨迹能够及时保存 + if (DateTime.Now - (_inkLockUntil.AddMilliseconds(-InkLockMilliseconds)) < TimeSpan.FromMilliseconds(50)) + { + return true; + } + // 只有在快速切换且页面不同时才锁定 return false; } diff --git a/Ink Canvas/Helpers/PPTManager.cs b/Ink Canvas/Helpers/PPTManager.cs index c638914b..44cbc810 100644 --- a/Ink Canvas/Helpers/PPTManager.cs +++ b/Ink Canvas/Helpers/PPTManager.cs @@ -850,10 +850,24 @@ namespace Ink_Canvas.Helpers // 如果在放映模式,获取放映窗口的演示文稿 if (IsInSlideShow && PPTApplication.SlideShowWindows.Count > 0) { - var slideShowWindow = PPTApplication.SlideShowWindows[1]; - if (slideShowWindow?.View != null) + try { - return (Presentation)slideShowWindow.View.Slide.Parent; + var slideShowWindow = PPTApplication.SlideShowWindows[1]; + if (slideShowWindow?.View != null) + { + return (Presentation)slideShowWindow.View.Slide.Parent; + } + } + catch (COMException comEx) + { + var hr = (uint)comEx.HResult; + if (hr == 0x80048240) // Integer out of range + { + LogHelper.WriteLogToFile($"验证PPT放映窗口失败: {comEx.Message}", LogHelper.LogType.Warning); + // 放映窗口已不存在,返回null + return null; + } + throw; // 重新抛出其他COM异常 } } diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 94370fc5..8a1d0a78 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -1121,14 +1121,48 @@ namespace Ink_Canvas { try { + // 检查PPT连接状态 + if (_pptManager?.IsConnected != true || _pptManager?.IsInSlideShow != true) + { + LogHelper.WriteLogToFile($"PPT未连接或未在放映状态,跳过页面切换: IsConnected={_pptManager?.IsConnected}, IsInSlideShow={_pptManager?.IsInSlideShow}", LogHelper.LogType.Warning); + return; + } + // 获取当前页面索引 var currentSlideIndex = _pptManager?.GetCurrentSlideNumber() ?? 0; + LogHelper.WriteLogToFile($"开始切换页面墨迹: 从第{currentSlideIndex}页到第{newSlideIndex}页", LogHelper.LogType.Trace); + + // 验证页面索引的有效性 + if (newSlideIndex <= 0) + { + LogHelper.WriteLogToFile($"无效的新页面索引: {newSlideIndex},跳过页面切换", LogHelper.LogType.Warning); + return; + } + // 如果有当前墨迹且不是第一次切换,先保存到当前页面 if (inkCanvas.Strokes.Count > 0 && currentSlideIndex > 0 && currentSlideIndex != newSlideIndex) { - _multiPPTInkManager?.SaveCurrentSlideStrokes(currentSlideIndex, inkCanvas.Strokes); - LogHelper.WriteLogToFile($"切换前保存第{currentSlideIndex}页墨迹,墨迹数量: {inkCanvas.Strokes.Count}", LogHelper.LogType.Trace); + // 检查是否可以写入墨迹 + bool canWrite = _multiPPTInkManager?.CanWriteInk(currentSlideIndex) == true; + LogHelper.WriteLogToFile($"第{currentSlideIndex}页墨迹写入权限: {canWrite}", LogHelper.LogType.Trace); + + if (canWrite) + { + // 正常保存 + _multiPPTInkManager?.SaveCurrentSlideStrokes(currentSlideIndex, inkCanvas.Strokes); + LogHelper.WriteLogToFile($"正常保存第{currentSlideIndex}页墨迹,墨迹数量: {inkCanvas.Strokes.Count}", LogHelper.LogType.Trace); + } + else + { + // 墨迹被锁定,跳过保存以避免墨迹错页 + LogHelper.WriteLogToFile($"第{currentSlideIndex}页墨迹被锁定,跳过保存以避免墨迹错页", LogHelper.LogType.Warning); + } + } + else if (inkCanvas.Strokes.Count > 0 && currentSlideIndex <= 0) + { + // 无法获取当前页面索引时,不保存墨迹,直接清空 + LogHelper.WriteLogToFile($"无法获取当前页面索引({currentSlideIndex}),跳过墨迹保存", LogHelper.LogType.Warning); } // 切换到新页面并加载墨迹 @@ -1137,10 +1171,10 @@ namespace Ink_Canvas { inkCanvas.Strokes.Clear(); inkCanvas.Strokes.Add(newStrokes); + LogHelper.WriteLogToFile($"已切换到第{newSlideIndex}页,加载墨迹数量: {newStrokes.Count}", LogHelper.LogType.Trace); } - // 设置墨迹锁定 - _multiPPTInkManager?.LockInkForSlide(newSlideIndex); + // 注意:LockInkForSlide已经在SwitchToSlide中调用,这里不需要重复调用 } catch (Exception ex) { From dd16b4f5a14b9bce61ce39f6949ca708eff08d7b Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 21 Sep 2025 08:28:32 +0800 Subject: [PATCH 052/101] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/AssemblyInfo.cs | 4 ++-- Ink Canvas/Helpers/MultiPPTInkManager.cs | 1 - Ink Canvas/Helpers/PPTInkManager.cs | 2 -- Ink Canvas/Helpers/PPTManager.cs | 4 ---- Ink Canvas/Helpers/PPTUIManager.cs | 2 -- Ink Canvas/MainWindow_cs/MW_PPT.cs | 7 ------- Ink Canvas/Properties/AssemblyInfo.cs | 4 ++-- 7 files changed, 4 insertions(+), 20 deletions(-) diff --git a/Ink Canvas/AssemblyInfo.cs b/Ink Canvas/AssemblyInfo.cs index f87d71c3..8f8fb36e 100644 --- a/Ink Canvas/AssemblyInfo.cs +++ b/Ink Canvas/AssemblyInfo.cs @@ -49,5 +49,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.11.2")] -[assembly: AssemblyFileVersion("1.7.11.2")] +[assembly: AssemblyVersion("1.7.11.3")] +[assembly: AssemblyFileVersion("1.7.11.3")] diff --git a/Ink Canvas/Helpers/MultiPPTInkManager.cs b/Ink Canvas/Helpers/MultiPPTInkManager.cs index 67e4d3cb..8ba5df07 100644 --- a/Ink Canvas/Helpers/MultiPPTInkManager.cs +++ b/Ink Canvas/Helpers/MultiPPTInkManager.cs @@ -590,7 +590,6 @@ namespace Ink_Canvas.Helpers // 创建新的备份 _strokeBackups[presentationId][slideIndex] = strokes.Clone(); - LogHelper.WriteLogToFile($"已创建第{slideIndex}页墨迹备份", LogHelper.LogType.Trace); } catch (Exception ex) { diff --git a/Ink Canvas/Helpers/PPTInkManager.cs b/Ink Canvas/Helpers/PPTInkManager.cs index 9d02c79c..2fee446c 100644 --- a/Ink Canvas/Helpers/PPTInkManager.cs +++ b/Ink Canvas/Helpers/PPTInkManager.cs @@ -124,7 +124,6 @@ namespace Ink_Canvas.Helpers { if (DateTime.Now < _inkLockUntil) { - LogHelper.WriteLogToFile($"墨迹写入被锁定,当前页:{slideIndex},锁定页:{_lockedSlideIndex}", LogHelper.LogType.Warning); } return; } @@ -149,7 +148,6 @@ namespace Ink_Canvas.Helpers if (ms.Length > 0) { - LogHelper.WriteLogToFile($"已保存第{slideIndex}页墨迹,大小: {ms.Length} bytes", LogHelper.LogType.Trace); } // 检查内存使用情况 diff --git a/Ink Canvas/Helpers/PPTManager.cs b/Ink Canvas/Helpers/PPTManager.cs index 44cbc810..b26c89f4 100644 --- a/Ink Canvas/Helpers/PPTManager.cs +++ b/Ink Canvas/Helpers/PPTManager.cs @@ -93,7 +93,6 @@ namespace Ink_Canvas.Helpers // COM对象已失效,触发断开连接 DisconnectFromPPT(); } - LogHelper.WriteLogToFile($"验证PPT放映窗口失败: {comEx.Message} (HR: 0x{hr:X8})", LogHelper.LogType.Warning); return false; } } @@ -863,7 +862,6 @@ namespace Ink_Canvas.Helpers var hr = (uint)comEx.HResult; if (hr == 0x80048240) // Integer out of range { - LogHelper.WriteLogToFile($"验证PPT放映窗口失败: {comEx.Message}", LogHelper.LogType.Warning); // 放映窗口已不存在,返回null return null; } @@ -940,12 +938,10 @@ namespace Ink_Canvas.Helpers // COM对象已失效,触发断开连接 DisconnectFromPPT(); } - LogHelper.WriteLogToFile($"获取当前幻灯片编号失败: {comEx.Message}", LogHelper.LogType.Warning); return 0; } catch (Exception ex) { - LogHelper.WriteLogToFile($"获取当前幻灯片编号失败: {ex}", LogHelper.LogType.Error); return 0; } } diff --git a/Ink Canvas/Helpers/PPTUIManager.cs b/Ink Canvas/Helpers/PPTUIManager.cs index f7646bbd..c8482a4e 100644 --- a/Ink Canvas/Helpers/PPTUIManager.cs +++ b/Ink Canvas/Helpers/PPTUIManager.cs @@ -92,7 +92,6 @@ namespace Ink_Canvas.Helpers // 页数无效时清空页码显示 _mainWindow.PPTBtnPageNow.Text = "?"; _mainWindow.PPTBtnPageTotal.Text = "/ ?"; - LogHelper.WriteLogToFile($"PPT页数无效,清空页码显示: 当前页={currentSlide}, 总页数={totalSlides}", LogHelper.LogType.Warning); } UpdateNavigationPanelsVisibility(); @@ -132,7 +131,6 @@ namespace Ink_Canvas.Helpers // 页数无效时清空页码显示 _mainWindow.PPTBtnPageNow.Text = "?"; _mainWindow.PPTBtnPageTotal.Text = "/ ?"; - LogHelper.WriteLogToFile($"PPT页数无效,清空页码显示: 当前页={currentSlide}, 总页数={totalSlides}", LogHelper.LogType.Warning); } } catch (Exception ex) diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 8a1d0a78..8d66fd6d 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -1124,14 +1124,12 @@ namespace Ink_Canvas // 检查PPT连接状态 if (_pptManager?.IsConnected != true || _pptManager?.IsInSlideShow != true) { - LogHelper.WriteLogToFile($"PPT未连接或未在放映状态,跳过页面切换: IsConnected={_pptManager?.IsConnected}, IsInSlideShow={_pptManager?.IsInSlideShow}", LogHelper.LogType.Warning); return; } // 获取当前页面索引 var currentSlideIndex = _pptManager?.GetCurrentSlideNumber() ?? 0; - LogHelper.WriteLogToFile($"开始切换页面墨迹: 从第{currentSlideIndex}页到第{newSlideIndex}页", LogHelper.LogType.Trace); // 验证页面索引的有效性 if (newSlideIndex <= 0) @@ -1145,24 +1143,20 @@ namespace Ink_Canvas { // 检查是否可以写入墨迹 bool canWrite = _multiPPTInkManager?.CanWriteInk(currentSlideIndex) == true; - LogHelper.WriteLogToFile($"第{currentSlideIndex}页墨迹写入权限: {canWrite}", LogHelper.LogType.Trace); if (canWrite) { // 正常保存 _multiPPTInkManager?.SaveCurrentSlideStrokes(currentSlideIndex, inkCanvas.Strokes); - LogHelper.WriteLogToFile($"正常保存第{currentSlideIndex}页墨迹,墨迹数量: {inkCanvas.Strokes.Count}", LogHelper.LogType.Trace); } else { // 墨迹被锁定,跳过保存以避免墨迹错页 - LogHelper.WriteLogToFile($"第{currentSlideIndex}页墨迹被锁定,跳过保存以避免墨迹错页", LogHelper.LogType.Warning); } } else if (inkCanvas.Strokes.Count > 0 && currentSlideIndex <= 0) { // 无法获取当前页面索引时,不保存墨迹,直接清空 - LogHelper.WriteLogToFile($"无法获取当前页面索引({currentSlideIndex}),跳过墨迹保存", LogHelper.LogType.Warning); } // 切换到新页面并加载墨迹 @@ -1171,7 +1165,6 @@ namespace Ink_Canvas { inkCanvas.Strokes.Clear(); inkCanvas.Strokes.Add(newStrokes); - LogHelper.WriteLogToFile($"已切换到第{newSlideIndex}页,加载墨迹数量: {newStrokes.Count}", LogHelper.LogType.Trace); } // 注意:LockInkForSlide已经在SwitchToSlide中调用,这里不需要重复调用 diff --git a/Ink Canvas/Properties/AssemblyInfo.cs b/Ink Canvas/Properties/AssemblyInfo.cs index f87d71c3..8f8fb36e 100644 --- a/Ink Canvas/Properties/AssemblyInfo.cs +++ b/Ink Canvas/Properties/AssemblyInfo.cs @@ -49,5 +49,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.11.2")] -[assembly: AssemblyFileVersion("1.7.11.2")] +[assembly: AssemblyVersion("1.7.11.3")] +[assembly: AssemblyFileVersion("1.7.11.3")] From 37a69032f6fe984cc29985e3289e87c33c28651c Mon Sep 17 00:00:00 2001 From: PrefacedCorg <1876568293@qq.com> Date: Mon, 22 Sep 2025 09:34:39 +0800 Subject: [PATCH 053/101] Replace SymbolIcon with FontIcon throughout UI Updated all XAML and code-behind references from SymbolIcon/Symbol to FontIcon/Glyph for consistency and compatibility with the UI framework. This affects button icons, window controls, and shape drawing logic across multiple windows and components. --- Ink Canvas/MainWindow.xaml | 12 ++++++------ Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs | 6 +++--- Ink Canvas/Windows/CountdownTimerWindow.xaml | 18 +++++++++--------- .../Windows/CountdownTimerWindow.xaml.cs | 16 ++++++++-------- Ink Canvas/Windows/OperatingGuideWindow.xaml | 6 +++--- .../Windows/OperatingGuideWindow.xaml.cs | 6 +++--- Ink Canvas/Windows/RandWindow.xaml | 10 +++++----- Ink Canvas/Windows/RandWindow.xaml.cs | 6 +++--- .../Windows/YesOrNoNotificationWindow.xaml | 4 ++-- 9 files changed, 42 insertions(+), 42 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 6c377a93..1504a0bf 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -5641,7 +5641,7 @@ - - + @@ -6552,7 +6552,7 @@ Background="{Binding ElementName=BtnExit, Path=Background}" IsEnabled="False" Visibility="Collapsed" IsEnabledChanged="Btn_IsEnabledChanged"> - + @@ -6562,7 +6562,7 @@ Background="{Binding ElementName=BtnExit, Path=Background}" IsEnabled="False" Visibility="Collapsed" IsEnabledChanged="Btn_IsEnabledChanged"> - + @@ -8424,7 +8424,7 @@ - --> + --> diff --git a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs index 922111de..576c250d 100644 --- a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs +++ b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs @@ -1,4 +1,4 @@ -using Ink_Canvas.Helpers; +using Ink_Canvas.Helpers; using iNKORE.UI.WPF.Modern.Controls; using System; using System.Collections.Generic; @@ -75,9 +75,9 @@ namespace Ink_Canvas ToggleSwitchDrawShapeBorderAutoHide.IsOn = !ToggleSwitchDrawShapeBorderAutoHide.IsOn; if (ToggleSwitchDrawShapeBorderAutoHide.IsOn) - ((SymbolIcon)sender).Symbol = Symbol.Pin; + ((FontIcon)sender).Glyph = "Pin"; else - ((SymbolIcon)sender).Symbol = Symbol.UnPin; + ((FontIcon)sender).Glyph = "UnPin"; } private object lastMouseDownSender; diff --git a/Ink Canvas/Windows/CountdownTimerWindow.xaml b/Ink Canvas/Windows/CountdownTimerWindow.xaml index 6fed4d88..caf7e339 100644 --- a/Ink Canvas/Windows/CountdownTimerWindow.xaml +++ b/Ink Canvas/Windows/CountdownTimerWindow.xaml @@ -1,4 +1,4 @@ - - + @@ -179,12 +179,12 @@ - + - + @@ -194,12 +194,12 @@ - + - + @@ -215,7 +215,7 @@ - + - + - + diff --git a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs index a90e6b1d..0fa48a5a 100644 --- a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs +++ b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs @@ -1,4 +1,4 @@ -using Ink_Canvas.Helpers; +using Ink_Canvas.Helpers; using System; using System.Media; using System.Timers; @@ -51,7 +51,7 @@ namespace Ink_Canvas TextBlockSecond.Text = "00"; timer.Stop(); isTimerRunning = false; - SymbolIconStart.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.Play; + SymbolIconStart.Glyph = "Play"; BtnStartCover.Visibility = Visibility.Visible; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); BorderStopTime.Visibility = Visibility.Collapsed; @@ -202,12 +202,12 @@ namespace Ink_Canvas if (WindowState == WindowState.Normal) { WindowState = WindowState.Maximized; - SymbolIconFullscreen.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.BackToWindow; + SymbolIconFullscreen.Glyph = "BackToWindow"; } else { WindowState = WindowState.Normal; - SymbolIconFullscreen.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.FullScreen; + SymbolIconFullscreen.Glyph = "FullScreen"; } } @@ -232,7 +232,7 @@ namespace Ink_Canvas BtnStartCover.Visibility = Visibility.Collapsed; BorderStopTime.Visibility = Visibility.Collapsed; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); - SymbolIconStart.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.Play; + SymbolIconStart.Glyph = "Play"; isTimerRunning = false; timer.Stop(); isPaused = false; @@ -282,7 +282,7 @@ namespace Ink_Canvas startTime += DateTime.Now - pauseTime; ProcessBarTime.IsPaused = false; TextBlockHour.Foreground = Brushes.Black; - SymbolIconStart.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.Pause; + SymbolIconStart.Glyph = "Pause"; isPaused = false; timer.Start(); UpdateStopTime(); @@ -294,7 +294,7 @@ namespace Ink_Canvas pauseTime = DateTime.Now; ProcessBarTime.IsPaused = true; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); - SymbolIconStart.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.Play; + SymbolIconStart.Glyph = "Play"; BorderStopTime.Visibility = Visibility.Collapsed; isPaused = true; timer.Stop(); @@ -306,7 +306,7 @@ namespace Ink_Canvas totalSeconds = ((hour * 60) + minute) * 60 + second; ProcessBarTime.IsPaused = false; TextBlockHour.Foreground = Brushes.Black; - SymbolIconStart.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.Pause; + SymbolIconStart.Glyph = "Pause"; BtnResetCover.Visibility = Visibility.Collapsed; if (totalSeconds <= 10) diff --git a/Ink Canvas/Windows/OperatingGuideWindow.xaml b/Ink Canvas/Windows/OperatingGuideWindow.xaml index 67c81734..581dfa4e 100644 --- a/Ink Canvas/Windows/OperatingGuideWindow.xaml +++ b/Ink Canvas/Windows/OperatingGuideWindow.xaml @@ -1,4 +1,4 @@ - - + - + diff --git a/Ink Canvas/Windows/OperatingGuideWindow.xaml.cs b/Ink Canvas/Windows/OperatingGuideWindow.xaml.cs index 61c50f51..ca2fab3a 100644 --- a/Ink Canvas/Windows/OperatingGuideWindow.xaml.cs +++ b/Ink Canvas/Windows/OperatingGuideWindow.xaml.cs @@ -1,4 +1,4 @@ -using Ink_Canvas.Helpers; +using Ink_Canvas.Helpers; using System.Windows; using System.Windows.Input; @@ -30,12 +30,12 @@ namespace Ink_Canvas if (WindowState == WindowState.Normal) { WindowState = WindowState.Maximized; - SymbolIconFullscreen.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.BackToWindow; + SymbolIconFullscreen.Glyph = "BackToWindow"; } else { WindowState = WindowState.Normal; - SymbolIconFullscreen.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.FullScreen; + SymbolIconFullscreen.Glyph = "FullScreen"; } } diff --git a/Ink Canvas/Windows/RandWindow.xaml b/Ink Canvas/Windows/RandWindow.xaml index f1bada9c..7fce00d0 100644 --- a/Ink Canvas/Windows/RandWindow.xaml +++ b/Ink Canvas/Windows/RandWindow.xaml @@ -1,4 +1,4 @@ - - + @@ -113,7 +113,7 @@ - + @@ -127,7 +127,7 @@ - + @@ -137,7 +137,7 @@ - + diff --git a/Ink Canvas/Windows/RandWindow.xaml.cs b/Ink Canvas/Windows/RandWindow.xaml.cs index f8f568fe..7156351a 100644 --- a/Ink Canvas/Windows/RandWindow.xaml.cs +++ b/Ink Canvas/Windows/RandWindow.xaml.cs @@ -1,4 +1,4 @@ -using Ink_Canvas.Helpers; +using Ink_Canvas.Helpers; using iNKORE.UI.WPF.Modern.Controls; using Microsoft.VisualBasic; using System; @@ -121,7 +121,7 @@ namespace Ink_Canvas if (RandMaxPeopleOneTime != -1 && TotalCount >= RandMaxPeopleOneTime) return; TotalCount++; LabelNumberCount.Text = TotalCount.ToString(); - SymbolIconStart.Symbol = Symbol.People; + SymbolIconStart.Glyph = "People"; BorderBtnAdd.Opacity = 1; BorderBtnMinus.Opacity = 1; } @@ -133,7 +133,7 @@ namespace Ink_Canvas LabelNumberCount.Text = TotalCount.ToString(); if (TotalCount == 1) { - SymbolIconStart.Symbol = Symbol.Contact; + SymbolIconStart.Glyph = "Contact"; } } diff --git a/Ink Canvas/Windows/YesOrNoNotificationWindow.xaml b/Ink Canvas/Windows/YesOrNoNotificationWindow.xaml index c633ae5c..a7fe8d0e 100644 --- a/Ink Canvas/Windows/YesOrNoNotificationWindow.xaml +++ b/Ink Canvas/Windows/YesOrNoNotificationWindow.xaml @@ -1,4 +1,4 @@ - - + From 79264b187d6877398735429ad6e9c978c241549f Mon Sep 17 00:00:00 2001 From: PrefacedCorg <1876568293@qq.com> Date: Mon, 22 Sep 2025 09:44:38 +0800 Subject: [PATCH 054/101] Remove unused exception variable in catch block The exception variable 'ex' in the catch block was unused and has been removed for cleaner code. --- Ink Canvas/Helpers/PPTManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ink Canvas/Helpers/PPTManager.cs b/Ink Canvas/Helpers/PPTManager.cs index b26c89f4..11e1bbed 100644 --- a/Ink Canvas/Helpers/PPTManager.cs +++ b/Ink Canvas/Helpers/PPTManager.cs @@ -940,7 +940,7 @@ namespace Ink_Canvas.Helpers } return 0; } - catch (Exception ex) + catch (Exception) { return 0; } From 2c8c4351dd4cf53e4903557f6830ce8089dc8ea7 Mon Sep 17 00:00:00 2001 From: PrefacedCorg <1876568293@qq.com> Date: Thu, 25 Sep 2025 10:26:38 +0800 Subject: [PATCH 055/101] Update WenXiang.png --- Ink Canvas/Resources/Icons-png/WenXiang.png | Bin 7672 -> 14917 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Ink Canvas/Resources/Icons-png/WenXiang.png b/Ink Canvas/Resources/Icons-png/WenXiang.png index efabf098ba2d7d763b8fe50fa790d228b399b97f..f3138fa5d6b5d92207d3ee839c7d908a04c7c949 100644 GIT binary patch literal 14917 zcmXY2bzGFs*WF#Zq*EGckd~H`knWTa>F$n2O1itHyStVWq(kXOx=R|~$M5g`gAaUm z*_~(Z+&TB0b7#Vo6{RsyNl-x`5XMKD52_##82A$mLPi9BeR3)>1A!<(A3unxdt@GW z>NtGTN>9DZ^0t2q!g&zK`GB)b7`OSBQ%tr{Rii{*u6*S;8EWVX+tWI6jQJrwT)gMzS#cPFKGYY|0z5h()_GirkkkgT$t6VI3lB#`8DsSmM( zJdlGBBKdct1Y_Vp$%&P)*W%yQU`BI+NP)qhu5_^m3}D8O5h(`K6aB`api%XMo2+90 ziTDdLg>U}bj}JP%M^+ce>|vGYsv{m*--R5zU-ymrnH$YIeL8T}R(&p|>yHU=2VWVT z5rXVp-3*>Y-apTej)c#BV`GK#DrGG`?3Ah%2Vj^nU9W*MYF>~P#J}-o&Lq?H{r&O4T|N{?}rk%8ndxhVgB0N^$76PcHXo~$6RA(!c^?E + /// 重置PPT相关的状态变量,当PPT自动收纳设置变更时调用 + /// + public void ResetPPTStateVariables() + { + try + { + // 重置进入PPT时的浮动栏收纳状态记录 + wasFloatingBarFoldedWhenEnterSlideShow = false; + + // 重置PPT放映结束事件标志 + isEnteredSlideShowEndEvent = false; + + // 重置演示文稿黑边状态 + isPresentationHaveBlackSpace = false; + + // 重置上次播放位置相关字段 + _lastPlaybackPage = 0; + _shouldNavigateToLastPage = false; + + // 重置页面切换防抖机制 + _lastSlideSwitchTime = DateTime.MinValue; + _pendingSlideIndex = -1; + + LogHelper.WriteLogToFile("PPT状态变量已重置", LogHelper.LogType.Trace); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"重置PPT状态变量失败: {ex.Message}", LogHelper.LogType.Error); + } + } + /// /// 使用防抖机制处理页面切换 /// diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index 4d521935..a77ed587 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -1406,7 +1406,18 @@ namespace Ink_Canvas private void ToggleSwitchAutoFoldInPPTSlideShow_Toggled(object sender, RoutedEventArgs e) { if (!isLoaded) return; + + // 记录设置变更前的状态 + bool previousState = Settings.Automation.IsAutoFoldInPPTSlideShow; Settings.Automation.IsAutoFoldInPPTSlideShow = ToggleSwitchAutoFoldInPPTSlideShow.IsOn; + + // 如果设置状态发生变化,重置PPT相关状态变量 + if (previousState != Settings.Automation.IsAutoFoldInPPTSlideShow) + { + ResetPPTStateVariables(); + LogHelper.WriteLogToFile($"PPT自动收纳设置已变更: {Settings.Automation.IsAutoFoldInPPTSlideShow}, 已重置相关状态变量", LogHelper.LogType.Trace); + } + if (Settings.Automation.IsAutoFoldInPPTSlideShow) { SettingsPPTInkingAndAutoFoldExplictBorder.Visibility = Visibility.Visible; From a9da8dc10c6e7b8592af9bf99f511f1f5a64bbb6 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Mon, 22 Sep 2025 11:48:05 +0800 Subject: [PATCH 057/101] =?UTF-8?q?fix:=E8=BF=9B=E5=85=A5PPT=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=94=B6=E7=BA=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_PPT.cs | 34 +++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index eb444b73..4875a08a 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -619,7 +619,7 @@ namespace Ink_Canvas { try { - // 记录进入放映时浮动栏收纳状态 + // 始终记录进入放映时浮动栏收纳状态,用于退出时恢复 wasFloatingBarFoldedWhenEnterSlideShow = isFloatingBarFolded; if (Settings.Automation.IsAutoFoldInPPTSlideShow) @@ -629,8 +629,11 @@ namespace Ink_Canvas } else { - // 如果关闭了自动收纳功能,重置状态记录,确保退出时不会错误收纳 - wasFloatingBarFoldedWhenEnterSlideShow = false; + // 如果关闭了PPT自动收纳功能,但用户当前在收纳模式下,进入PPT时取消收纳以提供更好的使用体验 + if (isFloatingBarFolded) + { + await UnFoldFloatingBar(new object()); + } } isStopInkReplay = true; @@ -781,10 +784,8 @@ namespace Ink_Canvas { try { - // 处理浮动栏状态:根据自动收纳功能状态和进入前的状态恢复 - if (Settings.Automation.IsAutoFoldInPPTSlideShow) + if (Settings.Automation.IsAutoFoldAfterPPTSlideShow) { - // 只有在启用自动收纳功能时才根据记录的状态恢复 if (wasFloatingBarFoldedWhenEnterSlideShow) { if (!isFloatingBarFolded) FoldFloatingBar_MouseUp(new object(), null); @@ -793,14 +794,27 @@ namespace Ink_Canvas { if (isFloatingBarFolded) await UnFoldFloatingBar(new object()); } + } else { - // 如果关闭了自动收纳功能,确保浮动栏展开 - if (isFloatingBarFolded) + if (Settings.Automation.IsAutoFoldInPPTSlideShow) { - await UnFoldFloatingBar(new object()); - LogHelper.WriteLogToFile("PPT自动收纳功能已关闭,强制展开浮动栏", LogHelper.LogType.Trace); + if (wasFloatingBarFoldedWhenEnterSlideShow) + { + if (!isFloatingBarFolded) FoldFloatingBar_MouseUp(new object(), null); + } + else + { + if (isFloatingBarFolded) await UnFoldFloatingBar(new object()); + } + } + else + { + if (isFloatingBarFolded) + { + await UnFoldFloatingBar(new object()); + } } } From 19685b8f9556e42a185d7f13c78a9e3b40c71094 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Mon, 22 Sep 2025 11:58:54 +0800 Subject: [PATCH 058/101] =?UTF-8?q?fix:=E8=BF=9B=E5=85=A5PPT=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=94=B6=E7=BA=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_PPT.cs | 74 +++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 7 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 4875a08a..bcb28f45 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -784,8 +784,10 @@ namespace Ink_Canvas { try { + // 处理浮动栏状态:根据"退出PPT放映后自动恢复浮动栏状态"设置决定是否恢复 if (Settings.Automation.IsAutoFoldAfterPPTSlideShow) { + // 如果启用了"退出PPT放映后自动恢复浮动栏状态"功能,则恢复到进入前的状态 if (wasFloatingBarFoldedWhenEnterSlideShow) { if (!isFloatingBarFolded) FoldFloatingBar_MouseUp(new object(), null); @@ -794,26 +796,27 @@ namespace Ink_Canvas { if (isFloatingBarFolded) await UnFoldFloatingBar(new object()); } - + LogHelper.WriteLogToFile($"退出PPT放映后自动恢复浮动栏状态: 恢复到进入前状态({wasFloatingBarFoldedWhenEnterSlideShow})", LogHelper.LogType.Trace); } else { + // 如果没有启用"退出PPT放映后自动恢复浮动栏状态"功能 if (Settings.Automation.IsAutoFoldInPPTSlideShow) { - if (wasFloatingBarFoldedWhenEnterSlideShow) + // 如果启用了"进入PPT时自动收纳"功能,退出时应该保持展开状态 + if (isFloatingBarFolded) { - if (!isFloatingBarFolded) FoldFloatingBar_MouseUp(new object(), null); - } - else - { - if (isFloatingBarFolded) await UnFoldFloatingBar(new object()); + await UnFoldFloatingBar(new object()); + LogHelper.WriteLogToFile("进入PPT时自动收纳功能启用,退出时保持展开状态", LogHelper.LogType.Trace); } } else { + // 如果两个功能都关闭,确保浮动栏展开 if (isFloatingBarFolded) { await UnFoldFloatingBar(new object()); + LogHelper.WriteLogToFile("PPT自动收纳功能已关闭,强制展开浮动栏", LogHelper.LogType.Trace); } } } @@ -1573,6 +1576,7 @@ namespace Ink_Canvas // 结束放映 if (_pptManager?.TryEndSlideShow() == true) { + // 如果成功结束放映,等待OnPPTSlideShowEnd事件处理收纳状态恢复 } else { @@ -1585,6 +1589,9 @@ namespace Ink_Canvas _pptUIManager?.UpdateSidebarExitButtons(false); LogHelper.WriteLogToFile("手动更新放映结束UI状态", LogHelper.LogType.Trace); }); + + // 手动处理收纳状态恢复,因为OnPPTSlideShowEnd事件可能未触发 + await HandleManualSlideShowEnd(); } HideSubPanels("cursor"); @@ -1603,6 +1610,59 @@ namespace Ink_Canvas _pptUIManager?.UpdateSlideShowStatus(false); _pptUIManager?.UpdateSidebarExitButtons(false); }); + + // 异常情况下也手动处理收纳状态恢复 + await HandleManualSlideShowEnd(); + } + } + + /// + /// 手动处理PPT放映结束时的收纳状态恢复 + /// + private async Task HandleManualSlideShowEnd() + { + try + { + // 处理浮动栏状态:根据"退出PPT放映后自动恢复浮动栏状态"设置决定是否恢复 + if (Settings.Automation.IsAutoFoldAfterPPTSlideShow) + { + // 如果启用了"退出PPT放映后自动恢复浮动栏状态"功能,则恢复到进入前的状态 + if (wasFloatingBarFoldedWhenEnterSlideShow) + { + if (!isFloatingBarFolded) FoldFloatingBar_MouseUp(new object(), null); + } + else + { + if (isFloatingBarFolded) await UnFoldFloatingBar(new object()); + } + LogHelper.WriteLogToFile($"手动处理PPT放映结束: 恢复到进入前状态({wasFloatingBarFoldedWhenEnterSlideShow})", LogHelper.LogType.Trace); + } + else + { + // 如果没有启用"退出PPT放映后自动恢复浮动栏状态"功能 + if (Settings.Automation.IsAutoFoldInPPTSlideShow) + { + // 如果启用了"进入PPT时自动收纳"功能,退出时应该保持展开状态 + if (isFloatingBarFolded) + { + await UnFoldFloatingBar(new object()); + LogHelper.WriteLogToFile("手动处理PPT放映结束: 进入PPT时自动收纳功能启用,退出时保持展开状态", LogHelper.LogType.Trace); + } + } + else + { + // 如果两个功能都关闭,确保浮动栏展开 + if (isFloatingBarFolded) + { + await UnFoldFloatingBar(new object()); + LogHelper.WriteLogToFile("手动处理PPT放映结束: PPT自动收纳功能已关闭,强制展开浮动栏", LogHelper.LogType.Trace); + } + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"手动处理PPT放映结束收纳状态恢复失败: {ex}", LogHelper.LogType.Error); } } From fd1e5e13fe6ab48eb6a5f72ff984f6cb5b91a926 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Mon, 22 Sep 2025 12:11:03 +0800 Subject: [PATCH 059/101] =?UTF-8?q?fix:=E8=BF=9B=E5=85=A5PPT=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=94=B6=E7=BA=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_PPT.cs | 61 +++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index bcb28f45..afa98818 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -1597,8 +1597,36 @@ namespace Ink_Canvas HideSubPanels("cursor"); SetCurrentToolMode(InkCanvasEditingMode.None); + // 根据"退出PPT放映后自动恢复浮动栏状态"设置决定浮动栏边距 await Task.Delay(150); - ViewboxFloatingBarMarginAnimation(100, true); + if (Settings.Automation.IsAutoFoldAfterPPTSlideShow) + { + // 如果启用了"退出PPT放映后自动恢复浮动栏状态"功能,根据进入前状态设置边距 + if (wasFloatingBarFoldedWhenEnterSlideShow) + { + // 进入前是收纳状态,设置为收纳边距 + ViewboxFloatingBarMarginAnimation(-60); + } + else + { + // 进入前是展开状态,设置为展开边距 + ViewboxFloatingBarMarginAnimation(100, true); + } + } + else + { + // 如果没有启用"退出PPT放映后自动恢复浮动栏状态"功能,根据当前状态设置边距 + if (isFloatingBarFolded) + { + // 如果浮动栏处于收纳状态,设置为收纳边距 + ViewboxFloatingBarMarginAnimation(-60); + } + else + { + // 如果浮动栏处于展开状态,设置为展开边距 + ViewboxFloatingBarMarginAnimation(100, true); + } + } } catch (Exception ex) { @@ -1613,6 +1641,37 @@ namespace Ink_Canvas // 异常情况下也手动处理收纳状态恢复 await HandleManualSlideShowEnd(); + + // 异常情况下也要根据设置决定浮动栏边距 + await Task.Delay(150); + if (Settings.Automation.IsAutoFoldAfterPPTSlideShow) + { + // 如果启用了"退出PPT放映后自动恢复浮动栏状态"功能,根据进入前状态设置边距 + if (wasFloatingBarFoldedWhenEnterSlideShow) + { + // 进入前是收纳状态,设置为收纳边距 + ViewboxFloatingBarMarginAnimation(-60); + } + else + { + // 进入前是展开状态,设置为展开边距 + ViewboxFloatingBarMarginAnimation(100, true); + } + } + else + { + // 如果没有启用"退出PPT放映后自动恢复浮动栏状态"功能,根据当前状态设置边距 + if (isFloatingBarFolded) + { + // 如果浮动栏处于收纳状态,设置为收纳边距 + ViewboxFloatingBarMarginAnimation(-60); + } + else + { + // 如果浮动栏处于展开状态,设置为展开边距 + ViewboxFloatingBarMarginAnimation(100, true); + } + } } } From 14c9ce3ce1d265726c6843f24e4b4a00922af066 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Mon, 22 Sep 2025 12:32:53 +0800 Subject: [PATCH 060/101] fix:issue #219 --- Ink Canvas/MainWindow_cs/MW_Settings.cs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index a77ed587..9b40bdb3 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -1000,11 +1000,23 @@ namespace Ink_Canvas PPTBtnPreviewRS.Visibility = Visibility.Collapsed; } - PPTBtnPreviewRSTransform.Y = -(Settings.PowerPointSettings.PPTRSButtonPosition * 0.5); - PPTBtnPreviewLSTransform.Y = -(Settings.PowerPointSettings.PPTLSButtonPosition * 0.5); + // 计算预览区域的缩放比例 + double previewScaleY = 182.0 / SystemParameters.PrimaryScreenHeight; + double previewScaleX = 324.0 / SystemParameters.PrimaryScreenWidth; + + double sideButtonScaleFactor = 1.9; + + double rsPosition = Settings.PowerPointSettings.PPTRSButtonPosition; + double lsPosition = Settings.PowerPointSettings.PPTLSButtonPosition; + + PPTBtnPreviewRSTransform.Y = -(rsPosition * 2 * previewScaleY / sideButtonScaleFactor); + PPTBtnPreviewLSTransform.Y = -(lsPosition * 2 * previewScaleY / sideButtonScaleFactor); - PPTBtnPreviewLBTransform.X = -(Settings.PowerPointSettings.PPTLBButtonPosition * 0.5); - PPTBtnPreviewRBTransform.X = -(Settings.PowerPointSettings.PPTRBButtonPosition * 0.5); + + double bottomButtonScaleFactor = 1.2; + double leftMarginOffset = 6 * previewScaleX; + PPTBtnPreviewLBTransform.X = leftMarginOffset + (Settings.PowerPointSettings.PPTLBButtonPosition * previewScaleX / bottomButtonScaleFactor); + PPTBtnPreviewRBTransform.X = -(leftMarginOffset + (Settings.PowerPointSettings.PPTRBButtonPosition * previewScaleX / bottomButtonScaleFactor)); } private void ToggleSwitchShowCursor_Toggled(object sender, RoutedEventArgs e) From 091a256bccaf98544b2e7735ad46f08ec8bc75ad Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Mon, 22 Sep 2025 13:09:43 +0800 Subject: [PATCH 061/101] Revert "Replace SymbolIcon with FontIcon throughout UI" This reverts commit 37a69032f6fe984cc29985e3289e87c33c28651c. --- Ink Canvas/MainWindow.xaml | 12 ++++++------ Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs | 6 +++--- Ink Canvas/Windows/CountdownTimerWindow.xaml | 18 +++++++++--------- .../Windows/CountdownTimerWindow.xaml.cs | 16 ++++++++-------- Ink Canvas/Windows/OperatingGuideWindow.xaml | 6 +++--- .../Windows/OperatingGuideWindow.xaml.cs | 6 +++--- Ink Canvas/Windows/RandWindow.xaml | 10 +++++----- Ink Canvas/Windows/RandWindow.xaml.cs | 6 +++--- .../Windows/YesOrNoNotificationWindow.xaml | 4 ++-- 9 files changed, 42 insertions(+), 42 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 54c2636f..614d5a16 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -5655,7 +5655,7 @@ - - + @@ -6566,7 +6566,7 @@ Background="{Binding ElementName=BtnExit, Path=Background}" IsEnabled="False" Visibility="Collapsed" IsEnabledChanged="Btn_IsEnabledChanged"> - + @@ -6576,7 +6576,7 @@ Background="{Binding ElementName=BtnExit, Path=Background}" IsEnabled="False" Visibility="Collapsed" IsEnabledChanged="Btn_IsEnabledChanged"> - + @@ -8438,7 +8438,7 @@ - --> + --> diff --git a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs index 576c250d..922111de 100644 --- a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs +++ b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs @@ -1,4 +1,4 @@ -using Ink_Canvas.Helpers; +using Ink_Canvas.Helpers; using iNKORE.UI.WPF.Modern.Controls; using System; using System.Collections.Generic; @@ -75,9 +75,9 @@ namespace Ink_Canvas ToggleSwitchDrawShapeBorderAutoHide.IsOn = !ToggleSwitchDrawShapeBorderAutoHide.IsOn; if (ToggleSwitchDrawShapeBorderAutoHide.IsOn) - ((FontIcon)sender).Glyph = "Pin"; + ((SymbolIcon)sender).Symbol = Symbol.Pin; else - ((FontIcon)sender).Glyph = "UnPin"; + ((SymbolIcon)sender).Symbol = Symbol.UnPin; } private object lastMouseDownSender; diff --git a/Ink Canvas/Windows/CountdownTimerWindow.xaml b/Ink Canvas/Windows/CountdownTimerWindow.xaml index caf7e339..6fed4d88 100644 --- a/Ink Canvas/Windows/CountdownTimerWindow.xaml +++ b/Ink Canvas/Windows/CountdownTimerWindow.xaml @@ -1,4 +1,4 @@ - - + @@ -179,12 +179,12 @@ - + - + @@ -194,12 +194,12 @@ - + - + @@ -215,7 +215,7 @@ - + - + - + diff --git a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs index 0fa48a5a..a90e6b1d 100644 --- a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs +++ b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs @@ -1,4 +1,4 @@ -using Ink_Canvas.Helpers; +using Ink_Canvas.Helpers; using System; using System.Media; using System.Timers; @@ -51,7 +51,7 @@ namespace Ink_Canvas TextBlockSecond.Text = "00"; timer.Stop(); isTimerRunning = false; - SymbolIconStart.Glyph = "Play"; + SymbolIconStart.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.Play; BtnStartCover.Visibility = Visibility.Visible; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); BorderStopTime.Visibility = Visibility.Collapsed; @@ -202,12 +202,12 @@ namespace Ink_Canvas if (WindowState == WindowState.Normal) { WindowState = WindowState.Maximized; - SymbolIconFullscreen.Glyph = "BackToWindow"; + SymbolIconFullscreen.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.BackToWindow; } else { WindowState = WindowState.Normal; - SymbolIconFullscreen.Glyph = "FullScreen"; + SymbolIconFullscreen.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.FullScreen; } } @@ -232,7 +232,7 @@ namespace Ink_Canvas BtnStartCover.Visibility = Visibility.Collapsed; BorderStopTime.Visibility = Visibility.Collapsed; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); - SymbolIconStart.Glyph = "Play"; + SymbolIconStart.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.Play; isTimerRunning = false; timer.Stop(); isPaused = false; @@ -282,7 +282,7 @@ namespace Ink_Canvas startTime += DateTime.Now - pauseTime; ProcessBarTime.IsPaused = false; TextBlockHour.Foreground = Brushes.Black; - SymbolIconStart.Glyph = "Pause"; + SymbolIconStart.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.Pause; isPaused = false; timer.Start(); UpdateStopTime(); @@ -294,7 +294,7 @@ namespace Ink_Canvas pauseTime = DateTime.Now; ProcessBarTime.IsPaused = true; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); - SymbolIconStart.Glyph = "Play"; + SymbolIconStart.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.Play; BorderStopTime.Visibility = Visibility.Collapsed; isPaused = true; timer.Stop(); @@ -306,7 +306,7 @@ namespace Ink_Canvas totalSeconds = ((hour * 60) + minute) * 60 + second; ProcessBarTime.IsPaused = false; TextBlockHour.Foreground = Brushes.Black; - SymbolIconStart.Glyph = "Pause"; + SymbolIconStart.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.Pause; BtnResetCover.Visibility = Visibility.Collapsed; if (totalSeconds <= 10) diff --git a/Ink Canvas/Windows/OperatingGuideWindow.xaml b/Ink Canvas/Windows/OperatingGuideWindow.xaml index 581dfa4e..67c81734 100644 --- a/Ink Canvas/Windows/OperatingGuideWindow.xaml +++ b/Ink Canvas/Windows/OperatingGuideWindow.xaml @@ -1,4 +1,4 @@ - - + - + diff --git a/Ink Canvas/Windows/OperatingGuideWindow.xaml.cs b/Ink Canvas/Windows/OperatingGuideWindow.xaml.cs index ca2fab3a..61c50f51 100644 --- a/Ink Canvas/Windows/OperatingGuideWindow.xaml.cs +++ b/Ink Canvas/Windows/OperatingGuideWindow.xaml.cs @@ -1,4 +1,4 @@ -using Ink_Canvas.Helpers; +using Ink_Canvas.Helpers; using System.Windows; using System.Windows.Input; @@ -30,12 +30,12 @@ namespace Ink_Canvas if (WindowState == WindowState.Normal) { WindowState = WindowState.Maximized; - SymbolIconFullscreen.Glyph = "BackToWindow"; + SymbolIconFullscreen.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.BackToWindow; } else { WindowState = WindowState.Normal; - SymbolIconFullscreen.Glyph = "FullScreen"; + SymbolIconFullscreen.Symbol = iNKORE.UI.WPF.Modern.Controls.Symbol.FullScreen; } } diff --git a/Ink Canvas/Windows/RandWindow.xaml b/Ink Canvas/Windows/RandWindow.xaml index 7fce00d0..f1bada9c 100644 --- a/Ink Canvas/Windows/RandWindow.xaml +++ b/Ink Canvas/Windows/RandWindow.xaml @@ -1,4 +1,4 @@ - - + @@ -113,7 +113,7 @@ - + @@ -127,7 +127,7 @@ - + @@ -137,7 +137,7 @@ - + diff --git a/Ink Canvas/Windows/RandWindow.xaml.cs b/Ink Canvas/Windows/RandWindow.xaml.cs index 7156351a..f8f568fe 100644 --- a/Ink Canvas/Windows/RandWindow.xaml.cs +++ b/Ink Canvas/Windows/RandWindow.xaml.cs @@ -1,4 +1,4 @@ -using Ink_Canvas.Helpers; +using Ink_Canvas.Helpers; using iNKORE.UI.WPF.Modern.Controls; using Microsoft.VisualBasic; using System; @@ -121,7 +121,7 @@ namespace Ink_Canvas if (RandMaxPeopleOneTime != -1 && TotalCount >= RandMaxPeopleOneTime) return; TotalCount++; LabelNumberCount.Text = TotalCount.ToString(); - SymbolIconStart.Glyph = "People"; + SymbolIconStart.Symbol = Symbol.People; BorderBtnAdd.Opacity = 1; BorderBtnMinus.Opacity = 1; } @@ -133,7 +133,7 @@ namespace Ink_Canvas LabelNumberCount.Text = TotalCount.ToString(); if (TotalCount == 1) { - SymbolIconStart.Glyph = "Contact"; + SymbolIconStart.Symbol = Symbol.Contact; } } diff --git a/Ink Canvas/Windows/YesOrNoNotificationWindow.xaml b/Ink Canvas/Windows/YesOrNoNotificationWindow.xaml index a7fe8d0e..c633ae5c 100644 --- a/Ink Canvas/Windows/YesOrNoNotificationWindow.xaml +++ b/Ink Canvas/Windows/YesOrNoNotificationWindow.xaml @@ -1,4 +1,4 @@ - - + From eea5f8496ccd36f2852880c1a093471414cbd412 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Mon, 22 Sep 2025 13:11:22 +0800 Subject: [PATCH 062/101] =?UTF-8?q?fix:=E9=AB=98=E5=85=89=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MainWindow_cs/MW_FloatingBarIcons.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 14069c2e..0ac52954 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -804,6 +804,36 @@ namespace Ink_Canvas BtnSwitch_Click(BtnSwitch, null); + if (currentMode == 0) + { + // 根据当前编辑模式正确设置工具模式和高光位置 + if (inkCanvas.EditingMode == InkCanvasEditingMode.None) + { + UpdateCurrentToolMode("cursor"); + SetFloatingBarHighlightPosition("cursor"); + } + else if (inkCanvas.EditingMode == InkCanvasEditingMode.Ink) + { + UpdateCurrentToolMode("pen"); + SetFloatingBarHighlightPosition("pen"); + } + else if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) + { + UpdateCurrentToolMode("eraser"); + SetFloatingBarHighlightPosition("eraser"); + } + else if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke) + { + UpdateCurrentToolMode("eraserByStrokes"); + SetFloatingBarHighlightPosition("eraserByStrokes"); + } + else if (inkCanvas.EditingMode == InkCanvasEditingMode.Select) + { + UpdateCurrentToolMode("select"); + SetFloatingBarHighlightPosition("select"); + } + } + if (currentMode == 0 && inkCanvas.Strokes.Count == 0 && BtnPPTSlideShowEnd.Visibility != Visibility.Visible) CursorIcon_Click(null, null); From a34a65f354270409fbf42c5449cb70857ac2bc1d Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Mon, 22 Sep 2025 13:26:53 +0800 Subject: [PATCH 063/101] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 0ac52954..ef34fd13 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -1937,7 +1937,6 @@ namespace Ink_Canvas { SaveStrokes(); RestoreStrokes(true); - LogHelper.WriteLogToFile($"退出白板模式,恢复备份墨迹。当前模式:{(BtnPPTSlideShowEnd.Visibility == Visibility.Visible ? "PPT放映" : "桌面")}", LogHelper.LogType.Trace); } if (BtnSwitchTheme.Content.ToString() == "浅色") From aa2b62e8dac8e35ed0aa91a603287728d8bda06c Mon Sep 17 00:00:00 2001 From: PrefacedCorg <1876568293@qq.com> Date: Mon, 22 Sep 2025 20:23:36 +0800 Subject: [PATCH 064/101] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=80=80=E5=87=BA?= =?UTF-8?q?=E6=94=BE=E6=98=A0=E6=8C=89=E9=92=AE=E5=AD=97=E4=BD=93=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=B8=8D=E5=AE=8C=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 把字体调小了() --- Ink Canvas/MainWindow.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 614d5a16..254341b1 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -9559,7 +9559,7 @@ Width="32" Margin="0" Visibility="Collapsed"> - + - + Date: Fri, 26 Sep 2025 22:14:12 +0800 Subject: [PATCH 065/101] Update MainWindow.xaml --- Ink Canvas/MainWindow.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 254341b1..40dfef3b 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -2765,7 +2765,7 @@ StrokeThickness="1" Margin="0,8,0,8" /> - From c670357c017b3fb410337858b097bb9f4657359b Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 27 Sep 2025 17:01:33 +0800 Subject: [PATCH 066/101] =?UTF-8?q?improve:=E6=A9=A1=E7=9A=AE=E6=93=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 20 +- Ink Canvas/MainWindow.xaml.cs | 14 +- Ink Canvas/MainWindow_cs/MW_BoardIcons.cs | 2 +- Ink Canvas/MainWindow_cs/MW_Eraser.cs | 1056 +++++------------ Ink Canvas/MainWindow_cs/MW_Eraser.xaml | 76 +- .../MainWindow_cs/MW_FloatingBarIcons.cs | 17 +- Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs | 5 +- Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 2 +- 8 files changed, 353 insertions(+), 839 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 40dfef3b..3415aded 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -3678,12 +3678,24 @@ SelectionChanged="inkCanvas_SelectionChanged" StrokeCollected="inkCanvas_StrokeCollected" ClipToBounds="False" Background="Transparent" /> - - + Loaded="EraserOverlayCanvas_Loaded" + Panel.ZIndex="1000"> + + + + + + + diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index f981f065..b152bf8e 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -357,23 +357,21 @@ namespace Ink_Canvas if (inkCanvas1.EditingMode == InkCanvasEditingMode.Ink) forcePointEraser = !forcePointEraser; - // 处理高级橡皮擦覆盖层的启用/禁用 - var eraserOverlay = FindName("AdvancedEraserOverlay") as Border; + // 处理橡皮擦覆盖层的启用/禁用 + var eraserOverlay = FindName("EraserOverlayCanvas") as Canvas; if (eraserOverlay != null) { if (inkCanvas1.EditingMode == InkCanvasEditingMode.EraseByPoint) { // 橡皮擦模式下启用覆盖层 - eraserOverlay.IsHitTestVisible = true; - Trace.WriteLine("Advanced Eraser: Overlay enabled in eraser mode"); + EnableEraserOverlay(); + Trace.WriteLine("Eraser: Overlay enabled in eraser mode"); } else { // 其他模式下禁用覆盖层 - eraserOverlay.IsHitTestVisible = false; - // 同时禁用高级橡皮擦系统 - DisableAdvancedEraserSystem(); - Trace.WriteLine("Advanced Eraser: Overlay disabled in non-eraser mode"); + DisableEraserOverlay(); + Trace.WriteLine("Eraser: Overlay disabled in non-eraser mode"); } } } diff --git a/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs b/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs index 4e41ca79..ab4a399e 100644 --- a/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs @@ -716,7 +716,7 @@ namespace Ink_Canvas //} //else { // 禁用高级橡皮擦系统 - DisableAdvancedEraserSystem(); + DisableEraserOverlay(); forceEraser = true; forcePointEraser = false; diff --git a/Ink Canvas/MainWindow_cs/MW_Eraser.cs b/Ink Canvas/MainWindow_cs/MW_Eraser.cs index 7cea34a9..e5d21a04 100644 --- a/Ink Canvas/MainWindow_cs/MW_Eraser.cs +++ b/Ink Canvas/MainWindow_cs/MW_Eraser.cs @@ -12,154 +12,277 @@ namespace Ink_Canvas { public partial class MainWindow : Window { + // 橡皮擦系统核心变量 + public bool isUsingGeometryEraser = false; + private IncrementalStrokeHitTester hitTester = null; - // 新橡皮擦系统的核心变量 - public bool isUsingAdvancedEraser; - private IncrementalStrokeHitTester advancedHitTester; + public double eraserWidth = 64; + public bool isEraserCircleShape = false; + public bool isUsingStrokesEraser = false; - // 橡皮擦配置 - public double currentEraserSize = 64; - public bool isCurrentEraserCircle; - public bool isUsingStrokeEraser; + private Matrix scaleMatrix = new Matrix(); - // 视觉反馈相关 - private Matrix eraserTransformMatrix; - private Point lastEraserPosition; - private bool isEraserVisible; + // 橡皮擦覆盖层相关控件 + private System.Windows.Controls.Canvas eraserOverlayCanvas; + private Image eraserFeedback; + private TranslateTransform eraserFeedbackTranslateTransform; - // 性能优化相关 - private DateTime lastEraserUpdate = DateTime.Now; - private const double ERASER_UPDATE_INTERVAL = 16.67; // 约60FPS - - // 锁定笔画的GUID(如果不存在则创建一个默认值) + // 锁定笔画的GUID private static readonly Guid IsLockGuid = new Guid("12345678-1234-1234-1234-123456789ABC"); - // 橡皮擦视觉反馈控件 - private DrawingVisual eraserVisual = new DrawingVisual(); - private VisualCanvas eraserOverlayCanvas = null; - private Border eraserVisualBorder; // 用于显示橡皮擦视觉反馈的Border - - // 兼容性属性:模拟原有的EraserOverlay_DrawingVisual - private VisualCanvas EraserOverlay_DrawingVisual => eraserOverlayCanvas; - - // 兼容性保持 - [Obsolete("使用 isUsingAdvancedEraser 替代")] - public bool isUsingGeometryEraser - { - get => isUsingAdvancedEraser; - set => isUsingAdvancedEraser = value; - } - - [Obsolete("使用 currentEraserSize 替代")] - public double eraserWidth - { - get => currentEraserSize; - set => currentEraserSize = value; - } - - [Obsolete("使用 isCurrentEraserCircle 替代")] - public bool isEraserCircleShape - { - get => isCurrentEraserCircle; - set => isCurrentEraserCircle = value; - } - - [Obsolete("使用 isUsingStrokeEraser 替代")] - public bool isUsingStrokesEraser - { - get => isUsingStrokeEraser; - set => isUsingStrokeEraser = value; - } - - [Obsolete("使用 eraserTransformMatrix 替代")] - private Matrix scaleMatrix - { - get => eraserTransformMatrix; - set => eraserTransformMatrix = value; - } - /// - /// 新橡皮擦覆盖层加载事件处理 + /// 橡皮擦覆盖层加载事件处理 /// - private void EraserOverlay_Loaded(object sender, RoutedEventArgs e) + private void EraserOverlayCanvas_Loaded(object sender, RoutedEventArgs e) { - var border = (Border)sender; + var canvas = (System.Windows.Controls.Canvas)sender; + eraserOverlayCanvas = canvas; - // 初始化覆盖层 - InitializeEraserOverlay(border); - - Trace.WriteLine("Advanced Eraser: Overlay loaded and initialized"); - } - - /// - /// 开始高级橡皮擦操作 - /// - private void StartAdvancedEraserOperation(object sender) - { - if (isUsingAdvancedEraser) return; - - // 设置操作状态 - isUsingAdvancedEraser = true; - isEraserVisible = true; - - // 更新橡皮擦尺寸 - UpdateEraserSize(); - - // 获取inkCanvas引用 - var inkCanvas = FindName("inkCanvas") as InkCanvas; - if (inkCanvas == null) return; - - // 根据橡皮擦形状创建碰撞检测器 - StylusShape eraserShape = CreateEraserShape(); - advancedHitTester = inkCanvas.Strokes.GetIncrementalStrokeHitTester(eraserShape); - advancedHitTester.StrokeHit += OnAdvancedEraserStrokeHit; - - // 初始化变换矩阵 - InitializeEraserTransform(); - } - - /// - /// 创建橡皮擦形状 - /// - private StylusShape CreateEraserShape() - { - if (isCurrentEraserCircle) + // 获取橡皮擦反馈控件 + eraserFeedback = FindName("EraserFeedback") as Image; + if (eraserFeedback != null) { - return new EllipseStylusShape(currentEraserSize, currentEraserSize); + eraserFeedbackTranslateTransform = eraserFeedback.RenderTransform as TranslateTransform; } - // 矩形橡皮擦,使用与原来相同的逻辑 - return new RectangleStylusShape(currentEraserSize, currentEraserSize / 0.6); + // 绑定事件处理 + canvas.StylusDown += ((o, args) => { + e.Handled = true; + if (args.StylusDevice.TabletDevice.Type == TabletDeviceType.Stylus) canvas.CaptureStylus(); + EraserOverlay_PointerDown(sender); + }); + canvas.StylusUp += ((o, args) => { + e.Handled = true; + if (args.StylusDevice.TabletDevice.Type == TabletDeviceType.Stylus) canvas.ReleaseStylusCapture(); + EraserOverlay_PointerUp(sender); + }); + canvas.StylusMove += ((o, args) => { + e.Handled = true; + EraserOverlay_PointerMove(sender, args.GetPosition(inkCanvas)); + }); + canvas.MouseDown += ((o, args) => { + canvas.CaptureMouse(); + EraserOverlay_PointerDown(sender); + }); + canvas.MouseUp += ((o, args) => { + canvas.ReleaseMouseCapture(); + EraserOverlay_PointerUp(sender); + }); + canvas.MouseMove += ((o, args) => { + EraserOverlay_PointerMove(sender, args.GetPosition(inkCanvas)); + }); + + // 设置橡皮擦样式 + UpdateEraserStyle(); } /// - /// 初始化橡皮擦变换矩阵 + /// 更新橡皮擦样式 /// - private void InitializeEraserTransform() + private void UpdateEraserStyle() { - eraserTransformMatrix = new Matrix(); + if (eraserFeedback == null) return; - if (isCurrentEraserCircle) + // 根据橡皮擦形状选择对应的图像资源 + string resourceKey = isEraserCircleShape ? "EllipseEraserImageSource" : "RectangleEraserImageSource"; + var imageSource = TryFindResource(resourceKey) as DrawingImage; + + if (imageSource != null) { - // 圆形橡皮擦:等比例缩放 - var scale = currentEraserSize / 56.0; // 基于56x56的基准尺寸 - eraserTransformMatrix.ScaleAt(scale, scale, 0, 0); + eraserFeedback.Source = imageSource; + } + } + + /// + /// 橡皮擦按下事件处理 + /// + private void EraserOverlay_PointerDown(object sender) + { + if (isUsingGeometryEraser) return; + + // 锁定 + isUsingGeometryEraser = true; + + // 计算高度 + var _h = eraserWidth * 56 / 38; + + // 初始化碰撞检测器 + StylusShape eraserShape; + if (isEraserCircleShape) + { + eraserShape = new EllipseStylusShape(eraserWidth, eraserWidth); } else { - // 矩形橡皮擦:保持传统比例 - var scaleX = currentEraserSize / 38.0; - var scaleY = (currentEraserSize * 56 / 38) / 56.0; - eraserTransformMatrix.ScaleAt(scaleX, scaleY, 0, 0); + eraserShape = new RectangleStylusShape(eraserWidth, _h); + } + + hitTester = inkCanvas.Strokes.GetIncrementalStrokeHitTester(eraserShape); + hitTester.StrokeHit += EraserGeometry_StrokeHit; + + // 计算缩放矩阵 + var scaleX = eraserWidth / 38; + var scaleY = _h / 56; + scaleMatrix = new Matrix(); + scaleMatrix.ScaleAt(scaleX, scaleY, 0, 0); + + // 设置橡皮擦反馈大小 + if (eraserFeedback != null) + { + eraserFeedback.Width = Math.Max(eraserWidth, 10); + eraserFeedback.Height = isEraserCircleShape ? eraserFeedback.Width : _h; + eraserFeedback.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); + eraserFeedback.Visibility = Visibility.Collapsed; + } + } + + /// + /// 橡皮擦抬起事件处理 + /// + private void EraserOverlay_PointerUp(object sender) + { + if (!isUsingGeometryEraser) return; + + // 解锁 + isUsingGeometryEraser = false; + + // 释放捕获 + ((UIElement)sender).ReleaseMouseCapture(); + + // 隐藏橡皮擦反馈 + if (eraserFeedback != null) + { + eraserFeedback.Visibility = Visibility.Collapsed; + } + + // 结束碰撞检测 + if (hitTester != null) + { + hitTester.EndHitTesting(); + hitTester = null; + } + + // 提交橡皮擦历史记录 + if (ReplacedStroke != null || AddedStroke != null) + { + timeMachine.CommitStrokeEraseHistory(ReplacedStroke, AddedStroke); + AddedStroke = null; + ReplacedStroke = null; + } + } + + /// + /// 橡皮擦移动事件处理 + /// + private void EraserOverlay_PointerMove(object sender, Point pt) + { + if (!isUsingGeometryEraser) return; + + if (isUsingStrokesEraser) + { + // 笔画橡皮擦模式 + var _filtered = inkCanvas.Strokes.HitTest(pt).Where(stroke => !stroke.ContainsPropertyData(IsLockGuid)); + var filtered = _filtered as Stroke[] ?? _filtered.ToArray(); + if (!filtered.Any()) return; + inkCanvas.Strokes.Remove(new StrokeCollection(filtered)); + } + else + { + // 几何橡皮擦模式 + // 显示橡皮擦反馈 + if (eraserFeedback != null && eraserFeedback.Visibility == Visibility.Collapsed) + { + eraserFeedback.Visibility = Visibility.Visible; + } + + // 更新橡皮擦位置 + if (eraserFeedbackTranslateTransform != null) + { + eraserFeedbackTranslateTransform.X = pt.X - eraserFeedback.ActualWidth / 2; + eraserFeedbackTranslateTransform.Y = pt.Y - eraserFeedback.ActualHeight / 2; + } + + // 添加点到碰撞检测器 + if (hitTester != null) + { + hitTester.AddPoint(pt); + } + } + } + + /// + /// 橡皮擦几何碰撞事件处理 + /// + private void EraserGeometry_StrokeHit(object sender, StrokeHitEventArgs args) + { + StrokeCollection eraseResult = args.GetPointEraseResults(); + StrokeCollection strokesToReplace = new StrokeCollection { args.HitStroke }; + + // 过滤锁定的笔画 + var filtered_2replace = strokesToReplace.Where(stroke => !stroke.ContainsPropertyData(IsLockGuid)); + var filtered2Replace = filtered_2replace as Stroke[] ?? filtered_2replace.ToArray(); + if (!filtered2Replace.Any()) return; + + var filtered_result = eraseResult.Where(stroke => !stroke.ContainsPropertyData(IsLockGuid)); + var filteredResult = filtered_result as Stroke[] ?? filtered_result.ToArray(); + + // 替换或删除笔画 + if (filteredResult.Any()) + { + inkCanvas.Strokes.Replace(new StrokeCollection(filtered2Replace), new StrokeCollection(filteredResult)); + } + else + { + inkCanvas.Strokes.Remove(new StrokeCollection(filtered2Replace)); + } + } + + /// + /// 启用橡皮擦覆盖层 + /// + public void EnableEraserOverlay() + { + if (eraserOverlayCanvas != null) + { + eraserOverlayCanvas.IsHitTestVisible = true; + eraserOverlayCanvas.Visibility = Visibility.Visible; + } + } + + /// + /// 禁用橡皮擦覆盖层 + /// + public void DisableEraserOverlay() + { + if (eraserOverlayCanvas != null) + { + eraserOverlayCanvas.IsHitTestVisible = false; + eraserOverlayCanvas.Visibility = Visibility.Collapsed; + } + + // 重置橡皮擦状态 + if (isUsingGeometryEraser) + { + isUsingGeometryEraser = false; + if (hitTester != null) + { + hitTester.EndHitTesting(); + hitTester = null; + } + } + + // 隐藏橡皮擦反馈 + if (eraserFeedback != null) + { + eraserFeedback.Visibility = Visibility.Collapsed; } } /// /// 更新橡皮擦尺寸 /// - private void UpdateEraserSize() + public void UpdateEraserSize() { - // 使用与原来相同的逻辑计算橡皮擦尺寸 double k = 1.0; switch (Settings.Canvas.EraserSize) @@ -172,706 +295,83 @@ namespace Ink_Canvas } // 更新形状类型 - isCurrentEraserCircle = (Settings.Canvas.EraserShapeType == 0); + isEraserCircleShape = (Settings.Canvas.EraserShapeType == 0); // 根据形状类型设置尺寸 - if (isCurrentEraserCircle) + if (isEraserCircleShape) { - currentEraserSize = k * 90; // 圆形橡皮擦 - } - else - { - currentEraserSize = k * 90 * 0.6; // 矩形橡皮擦宽度 - } - } - - /// - /// 结束高级橡皮擦操作 - /// - private void EndAdvancedEraserOperation(object sender) - { - if (!isUsingAdvancedEraser) return; - - // 重置操作状态 - isUsingAdvancedEraser = false; - isEraserVisible = false; - - // 释放鼠标捕获 - if (sender is Border border) - { - border.ReleaseMouseCapture(); - } - - // 隐藏橡皮擦视觉反馈 - HideEraserFeedback(); - - // 结束碰撞检测 - if (advancedHitTester != null) - { - advancedHitTester.EndHitTesting(); - advancedHitTester = null; - } - - // 提交橡皮擦历史记录 - CommitEraserHistory(); - } - - /// - /// 隐藏橡皮擦视觉反馈 - /// - private void HideEraserFeedback() - { - try - { - if (eraserVisualBorder != null) - { - eraserVisualBorder.Visibility = Visibility.Collapsed; - } - } - catch (Exception ex) - { - Trace.WriteLine($"Advanced Eraser: Error hiding feedback - {ex.Message}"); - } - } - - /// - /// 提交橡皮擦历史记录 - /// - private void CommitEraserHistory() - { - try - { - if (ReplacedStroke != null || AddedStroke != null) - { - timeMachine.CommitStrokeEraseHistory(ReplacedStroke, AddedStroke); - AddedStroke = null; - ReplacedStroke = null; - } - } - catch (Exception ex) - { - Trace.WriteLine($"Advanced Eraser: Error committing history - {ex.Message}"); - } - } - - /// - /// 高级橡皮擦笔画碰撞事件处理 - /// - private void OnAdvancedEraserStrokeHit(object sender, StrokeHitEventArgs args) - { - try - { - var inkCanvas = FindName("inkCanvas") as InkCanvas; - if (inkCanvas == null) return; - - var eraseResult = args.GetPointEraseResults(); - var strokeToReplace = new StrokeCollection { args.HitStroke }; - - // 过滤锁定的笔画 - var filteredToReplace = strokeToReplace.Where(stroke => !stroke.ContainsPropertyData(IsLockGuid)); - var filteredToReplaceArray = filteredToReplace as Stroke[] ?? filteredToReplace.ToArray(); - - if (!filteredToReplaceArray.Any()) return; - - var filteredResult = eraseResult.Where(stroke => !stroke.ContainsPropertyData(IsLockGuid)); - var filteredResultArray = filteredResult as Stroke[] ?? filteredResult.ToArray(); - - // 执行笔画替换或删除 - if (filteredResultArray.Any()) - { - inkCanvas.Strokes.Replace( - new StrokeCollection(filteredToReplaceArray), - new StrokeCollection(filteredResultArray) - ); + eraserWidth = k * 90; // 圆形橡皮擦 } else - { - inkCanvas.Strokes.Remove(new StrokeCollection(filteredToReplaceArray)); - } - } - catch (Exception ex) { - Trace.WriteLine($"Advanced Eraser: Error in stroke hit - {ex.Message}"); + eraserWidth = k * 90 * 0.6; // 矩形橡皮擦宽度 } + + // 更新橡皮擦样式 + UpdateEraserStyle(); } /// - /// 更新高级橡皮擦位置 + /// 切换橡皮擦形状 /// - private void UpdateAdvancedEraserPosition(object sender, Point position) + public void ToggleEraserShape() { - // 移除isUsingAdvancedEraser检查,让视觉反馈始终更新 - // if (!isUsingAdvancedEraser) return; - - // 性能优化:限制更新频率 - var now = DateTime.Now; - if ((now - lastEraserUpdate).TotalMilliseconds < ERASER_UPDATE_INTERVAL) - { - return; - } - lastEraserUpdate = now; - - // 更新位置 - lastEraserPosition = position; - - // 更新视觉反馈(始终执行) - UpdateEraserVisualFeedback(position); - - // 只有在实际使用橡皮擦时才处理擦除 - if (isUsingAdvancedEraser) - { - // 处理不同的橡皮擦模式 - if (isUsingStrokeEraser) - { - ProcessStrokeEraserAtPosition(position); - } - else - { - ProcessGeometryEraserAtPosition(position); - } - } + isEraserCircleShape = !isEraserCircleShape; + Settings.Canvas.EraserShapeType = isEraserCircleShape ? 0 : 1; + UpdateEraserStyle(); } /// - /// 在指定位置处理笔画橡皮擦 + /// 切换橡皮擦模式 /// - private void ProcessStrokeEraserAtPosition(Point position) + public void ToggleEraserMode() { - try - { - var inkCanvas = FindName("inkCanvas") as InkCanvas; - if (inkCanvas == null) return; - - var hitStrokes = inkCanvas.Strokes.HitTest(position) - .Where(stroke => !stroke.ContainsPropertyData(IsLockGuid)); - var strokesArray = hitStrokes as Stroke[] ?? hitStrokes.ToArray(); - - if (strokesArray.Any()) - { - inkCanvas.Strokes.Remove(new StrokeCollection(strokesArray)); - } - } - catch (Exception ex) - { - Trace.WriteLine($"Advanced Eraser: Error in stroke eraser - {ex.Message}"); - } + isUsingStrokesEraser = !isUsingStrokesEraser; } /// - /// 在指定位置处理几何橡皮擦 - /// - private void ProcessGeometryEraserAtPosition(Point position) - { - try - { - if (advancedHitTester != null) - { - advancedHitTester.AddPoint(position); - } - } - catch (Exception ex) - { - Trace.WriteLine($"Advanced Eraser: Error in geometry eraser - {ex.Message}"); - } - } - - /// - /// 更新橡皮擦视觉反馈 - /// - private void UpdateEraserVisualFeedback(Point position) - { - try - { - // 获取或创建橡皮擦视觉反馈Border - if (eraserVisualBorder == null) - { - eraserVisualBorder = new Border - { - Background = new SolidColorBrush(Colors.Transparent), - BorderBrush = new SolidColorBrush(Colors.Transparent), - BorderThickness = new Thickness(0), - IsHitTestVisible = false, - HorizontalAlignment = HorizontalAlignment.Left, - VerticalAlignment = VerticalAlignment.Top, - Opacity = 1 - }; - Panel.SetZIndex(eraserVisualBorder, 1001); - - // 将Border添加到InkCanvasGridForInkReplay中 - var inkCanvasGrid = FindName("InkCanvasGridForInkReplay") as Grid; - if (inkCanvasGrid != null) - { - inkCanvasGrid.Children.Add(eraserVisualBorder); - Trace.WriteLine("Advanced Eraser: Visual feedback border added to grid"); - } - else - { - Trace.WriteLine("Advanced Eraser: Failed to find InkCanvasGridForInkReplay"); - return; // 如果找不到Grid,直接返回 - } - } - - if (eraserVisualBorder != null) - { - // 创建橡皮擦视觉反馈 - var eraserImage = CreateEraserVisualImage(); - - // 清除Border的内容并添加新的图像 - eraserVisualBorder.Child = eraserImage; - - // 更新橡皮擦位置和大小 - if (isCurrentEraserCircle) - { - var radius = currentEraserSize / 2; - eraserVisualBorder.Width = currentEraserSize; - eraserVisualBorder.Height = currentEraserSize; - - // 使用Margin来定位,因为Border在Grid中 - eraserVisualBorder.Margin = new Thickness( - position.X - radius, - position.Y - radius, - 0, 0); - } - else - { - // 矩形橡皮擦,使用与原来相同的逻辑 - var height = currentEraserSize / 0.6; - eraserVisualBorder.Width = currentEraserSize; - eraserVisualBorder.Height = height; - - // 使用Margin来定位,因为Border在Grid中 - eraserVisualBorder.Margin = new Thickness( - position.X - currentEraserSize / 2, - position.Y - height / 2, - 0, 0); - } - - eraserVisualBorder.Visibility = Visibility.Visible; - Trace.WriteLine($"Advanced Eraser: Visual feedback updated to ({position.X:F1}, {position.Y:F1})"); - } - } - catch (Exception ex) - { - Trace.WriteLine($"Advanced Eraser: Error updating visual feedback - {ex.Message}"); - } - } - - /// - /// 创建橡皮擦视觉图像 - /// - private Image CreateEraserVisualImage() - { - try - { - // 根据橡皮擦形状选择对应的DrawingGroup资源 - string resourceKey = isCurrentEraserCircle ? "EraserCircleDrawingGroup" : "EraserDrawingGroup"; - - // 尝试从资源字典中获取DrawingGroup - var drawingGroup = TryFindResource(resourceKey) as DrawingGroup; - if (drawingGroup == null) - { - // 如果找不到资源,创建默认的橡皮擦图像 - return CreateDefaultEraserImage(); - } - - // 创建变换后的DrawingGroup - var transformedGroup = new DrawingGroup(); - transformedGroup.Children.Add(drawingGroup); - - // 应用缩放变换 - var transform = new ScaleTransform(); - if (isCurrentEraserCircle) - { - var scale = currentEraserSize / 56.0; // 基于56x56的基准尺寸 - transform.ScaleX = scale; - transform.ScaleY = scale; - } - else - { - var scaleX = currentEraserSize / 38.0; - var scaleY = (currentEraserSize / 0.6) / 56.0; - transform.ScaleX = scaleX; - transform.ScaleY = scaleY; - } - transformedGroup.Transform = transform; - - // 创建DrawingImage - var drawingImage = new DrawingImage(transformedGroup); - - // 创建Image控件 - var image = new Image - { - Source = drawingImage, - Stretch = Stretch.None - }; - RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.HighQuality); - - return image; - } - catch (Exception ex) - { - Trace.WriteLine($"Advanced Eraser: Error creating eraser visual image - {ex.Message}"); - return CreateDefaultEraserImage(); - } - } - - /// - /// 创建默认的橡皮擦图像(当资源不可用时) - /// - private Image CreateDefaultEraserImage() - { - try - { - // 创建一个简单的几何图形作为默认橡皮擦 - Geometry geometry; - if (isCurrentEraserCircle) - { - geometry = new EllipseGeometry(new Point(28, 28), 28, 28); - } - else - { - geometry = new RectangleGeometry(new Rect(0, 0, 38, 56)); - } - - var brush = new SolidColorBrush(Colors.LightGray); - var pen = new Pen(new SolidColorBrush(Colors.DarkGray), 1); - - var geometryDrawing = new GeometryDrawing(brush, pen, geometry); - var drawingGroup = new DrawingGroup(); - drawingGroup.Children.Add(geometryDrawing); - - // 应用缩放变换 - var transform = new ScaleTransform(); - if (isCurrentEraserCircle) - { - var scale = currentEraserSize / 56.0; - transform.ScaleX = scale; - transform.ScaleY = scale; - } - else - { - var scaleX = currentEraserSize / 38.0; - var scaleY = (currentEraserSize / 0.6) / 56.0; - transform.ScaleX = scaleX; - transform.ScaleY = scaleY; - } - drawingGroup.Transform = transform; - - var drawingImage = new DrawingImage(drawingGroup); - var image = new Image - { - Source = drawingImage, - Stretch = Stretch.None - }; - - return image; - } - catch (Exception ex) - { - Trace.WriteLine($"Advanced Eraser: Error creating default eraser image - {ex.Message}"); - return null; - } - } - - /// - /// 兼容性方法:旧版橡皮擦几何碰撞处理 - /// - [Obsolete("使用 OnAdvancedEraserStrokeHit 替代")] - private void EraserGeometry_StrokeHit(object sender, StrokeHitEventArgs args) - { - OnAdvancedEraserStrokeHit(sender, args); - } - - /// - /// 兼容性方法:旧版橡皮擦移动处理 - /// - [Obsolete("使用 UpdateAdvancedEraserPosition 替代")] - private void EraserOverlay_PointerMove(object sender, Point pt) - { - UpdateAdvancedEraserPosition(sender, pt); - } - - /// - /// 兼容性方法:旧版橡皮擦按下处理 - /// - [Obsolete("使用 StartAdvancedEraserOperation 替代")] - private void EraserOverlay_PointerDown(object sender) - { - StartAdvancedEraserOperation(sender); - } - - /// - /// 兼容性方法:旧版橡皮擦抬起处理 - /// - [Obsolete("使用 EndAdvancedEraserOperation 替代")] - private void EraserOverlay_PointerUp(object sender) - { - EndAdvancedEraserOperation(sender); - } - - /// - /// 获取当前橡皮擦状态信息(用于调试) - /// - public string GetEraserStatusInfo() - { - return "Advanced Eraser Status:\n" + - $"- Active: {isUsingAdvancedEraser}\n" + - $"- Size: {currentEraserSize:F1}\n" + - $"- Shape: {(isCurrentEraserCircle ? "Circle" : "Rectangle")}\n" + - $"- Mode: {(isUsingStrokeEraser ? "Stroke" : "Geometry")}\n" + - $"- Visible: {isEraserVisible}\n" + - $"- Last Position: ({lastEraserPosition.X:F1}, {lastEraserPosition.Y:F1})"; - } - - /// - /// 重置橡皮擦状态 - /// - public void ResetEraserState() - { - isUsingAdvancedEraser = false; - isEraserVisible = false; - lastEraserPosition = new Point(); - - if (advancedHitTester != null) - { - advancedHitTester.EndHitTesting(); - advancedHitTester = null; - } - - HideEraserFeedback(); - - // 清理视觉反馈Border - if (eraserVisualBorder != null) - { - var inkCanvasGrid = FindName("InkCanvasGridForInkReplay") as Grid; - if (inkCanvasGrid != null) - { - inkCanvasGrid.Children.Remove(eraserVisualBorder); - } - eraserVisualBorder = null; - } - } - - /// - /// 应用高级橡皮擦形状到InkCanvas + /// 应用橡皮擦形状到InkCanvas /// public void ApplyAdvancedEraserShape() { try { - var inkCanvas = FindName("inkCanvas") as InkCanvas; - if (inkCanvas == null) return; - - // 更新橡皮擦尺寸和形状 + // 更新橡皮擦尺寸 UpdateEraserSize(); // 创建橡皮擦形状 - StylusShape eraserShape = CreateEraserShape(); + StylusShape eraserShape; + if (isEraserCircleShape) + { + eraserShape = new EllipseStylusShape(eraserWidth, eraserWidth); + } + else + { + var height = eraserWidth * 56 / 38; + eraserShape = new RectangleStylusShape(eraserWidth, height); + } // 应用到InkCanvas inkCanvas.EraserShape = eraserShape; - Trace.WriteLine($"Advanced Eraser: Applied shape - Size: {currentEraserSize}, Circle: {isCurrentEraserCircle}"); + Trace.WriteLine($"Eraser: Applied shape - Size: {eraserWidth}, Circle: {isEraserCircleShape}"); } catch (Exception ex) { - Trace.WriteLine($"Advanced Eraser: Error applying shape - {ex.Message}"); - - // 回退到传统方法 - try - { - ApplyCurrentEraserShape(); - } - catch (Exception fallbackEx) - { - Trace.WriteLine($"Advanced Eraser: Fallback also failed - {fallbackEx.Message}"); - } + Trace.WriteLine($"Eraser: Error applying shape - {ex.Message}"); } } /// - /// 启用高级橡皮擦系统 + /// 获取橡皮擦状态信息 /// - public void EnableAdvancedEraserSystem() + public string GetEraserStatusInfo() { - try - { - // 获取橡皮擦覆盖层 - var eraserOverlay = FindName("AdvancedEraserOverlay") as Border; - if (eraserOverlay != null) - { - // 启用覆盖层的交互 - eraserOverlay.IsHitTestVisible = true; - - // 确保覆盖层在橡皮擦模式下启用 - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) - { - eraserOverlay.IsHitTestVisible = true; - Trace.WriteLine("Advanced Eraser: Overlay enabled for eraser mode"); - } - - // 设置覆盖层的大小以覆盖整个InkCanvas - var inkCanvasControl = FindName("inkCanvas") as InkCanvas; - if (inkCanvasControl != null) - { - eraserOverlay.Width = inkCanvasControl.ActualWidth; - eraserOverlay.Height = inkCanvasControl.ActualHeight; - Trace.WriteLine($"Advanced Eraser: Overlay size set to {eraserOverlay.Width}x{eraserOverlay.Height}"); - } - - Trace.WriteLine("Advanced Eraser: System enabled successfully"); - } - else - { - Trace.WriteLine("Advanced Eraser: Failed to find eraser overlay"); - } - } - catch (Exception ex) - { - Trace.WriteLine($"Advanced Eraser: Error enabling system - {ex.Message}"); - } - } - - /// - /// 初始化橡皮擦覆盖层 - /// - private void InitializeEraserOverlay(Border overlay) - { - try - { - // 设置覆盖层的基本属性 - overlay.Background = new SolidColorBrush(Colors.Transparent); - overlay.IsHitTestVisible = false; // 默认禁用,只在橡皮擦模式下启用 - - // 绑定事件处理 - overlay.MouseDown += (sender, e) => - { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) - { - overlay.CaptureMouse(); - StartAdvancedEraserOperation(sender); - - // 处理单点擦除 - var position = e.GetPosition((UIElement)FindName("inkCanvas")); - UpdateAdvancedEraserPosition(sender, position); - } - }; - - overlay.MouseUp += (sender, e) => - { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) - { - overlay.ReleaseMouseCapture(); - EndAdvancedEraserOperation(sender); - } - }; - - overlay.MouseMove += (sender, e) => - { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) - { - var position = e.GetPosition((UIElement)FindName("inkCanvas")); - Trace.WriteLine($"Advanced Eraser: Mouse move event triggered at ({position.X:F1}, {position.Y:F1})"); - UpdateAdvancedEraserPosition(sender, position); - } - else - { - Trace.WriteLine($"Advanced Eraser: Mouse move ignored - not in eraser mode, current mode: {inkCanvas.EditingMode}"); - } - }; - - // 触控笔事件 - overlay.StylusDown += (sender, e) => - { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) - { - e.Handled = true; - if (e.StylusDevice.TabletDevice.Type == TabletDeviceType.Stylus) - { - overlay.CaptureStylus(); - } - StartAdvancedEraserOperation(sender); - - // 处理单点擦除 - var position = e.GetPosition((UIElement)FindName("inkCanvas")); - UpdateAdvancedEraserPosition(sender, position); - } - }; - - overlay.StylusUp += (sender, e) => - { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) - { - e.Handled = true; - if (e.StylusDevice.TabletDevice.Type == TabletDeviceType.Stylus) - { - overlay.ReleaseStylusCapture(); - } - EndAdvancedEraserOperation(sender); - } - }; - - overlay.StylusMove += (sender, e) => - { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) - { - e.Handled = true; - var position = e.GetPosition((UIElement)FindName("inkCanvas")); - UpdateAdvancedEraserPosition(sender, position); - Trace.WriteLine($"Advanced Eraser: Stylus move at ({position.X:F1}, {position.Y:F1})"); - } - }; - - Trace.WriteLine("Advanced Eraser: Overlay initialized successfully"); - } - catch (Exception ex) - { - Trace.WriteLine($"Advanced Eraser: Error initializing overlay - {ex.Message}"); - } - } - - /// - /// 禁用高级橡皮擦系统 - /// - public void DisableAdvancedEraserSystem() - { - try - { - // 重置橡皮擦状态 - ResetEraserState(); - - // 获取橡皮擦覆盖层并禁用 - var eraserOverlay = FindName("AdvancedEraserOverlay") as Border; - if (eraserOverlay != null) - { - eraserOverlay.IsHitTestVisible = false; - } - - // 确保视觉反馈被隐藏 - HideEraserFeedback(); - - Trace.WriteLine("Advanced Eraser: System disabled successfully"); - } - catch (Exception ex) - { - Trace.WriteLine($"Advanced Eraser: Error disabling system - {ex.Message}"); - } - } - - /// - /// 切换橡皮擦形状(圆形/矩形) - /// - public void ToggleEraserShape() - { - isCurrentEraserCircle = !isCurrentEraserCircle; - - // 更新设置 - Settings.Canvas.EraserShapeType = isCurrentEraserCircle ? 0 : 1; - - // 应用新形状 - ApplyAdvancedEraserShape(); - - Trace.WriteLine($"Advanced Eraser: Toggled to {(isCurrentEraserCircle ? "Circle" : "Rectangle")}"); + return $"橡皮擦状态:\n" + + $"- 激活: {isUsingGeometryEraser}\n" + + $"- 尺寸: {eraserWidth:F1}\n" + + $"- 形状: {(isEraserCircleShape ? "圆形" : "矩形")}\n" + + $"- 模式: {(isUsingStrokesEraser ? "笔画" : "几何")}"; } } -} +} \ No newline at end of file diff --git a/Ink Canvas/MainWindow_cs/MW_Eraser.xaml b/Ink Canvas/MainWindow_cs/MW_Eraser.xaml index f6cdf56e..f12f83ba 100644 --- a/Ink Canvas/MainWindow_cs/MW_Eraser.xaml +++ b/Ink Canvas/MainWindow_cs/MW_Eraser.xaml @@ -1,36 +1,46 @@  - - - - - - - - - - - - - - - - + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index ef34fd13..24d3353e 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -1867,7 +1867,7 @@ namespace Ink_Canvas if (sender == Cursor_Icon && lastBorderMouseDownObject != Cursor_Icon) return; // 禁用高级橡皮擦系统 - DisableAdvancedEraserSystem(); + DisableEraserOverlay(); // 使用集中化的工具模式切换方法,确保快捷键状态正确更新 // 鼠标模式下应该禁用快捷键以放行键盘操作 @@ -1988,7 +1988,7 @@ namespace Ink_Canvas } // 禁用高级橡皮擦系统 - DisableAdvancedEraserSystem(); + DisableEraserOverlay(); ExitMultiTouchModeIfNeeded(); @@ -2240,7 +2240,7 @@ namespace Ink_Canvas } // 启用新的高级橡皮擦系统 - EnableAdvancedEraserSystem(); + EnableEraserOverlay(); // 使用新的高级橡皮擦系统 // 使用集中化的工具模式切换方法 @@ -2252,10 +2252,7 @@ namespace Ink_Canvas ApplyAdvancedEraserShape(); // 使用新的橡皮擦形状应用方法 SetCursorBasedOnEditingMode(inkCanvas); HideSubPanels("eraser"); // 高亮橡皮按钮 - - // 显示橡皮擦视觉反馈(用于测试) - // 注意:eraserVisualBorder在MW_Eraser.cs中定义,这里无法直接访问 - Trace.WriteLine($"Advanced Eraser: Eraser button clicked, current size: {currentEraserSize}, circle: {isCurrentEraserCircle}"); + Trace.WriteLine($"Eraser: Eraser button clicked, current size: {eraserWidth}, circle: {isEraserCircleShape}"); if (isAlreadyEraser) { @@ -2284,7 +2281,7 @@ namespace Ink_Canvas drawingShapeMode = 0; // 启用新的高级橡皮擦系统 - EnableAdvancedEraserSystem(); + EnableEraserOverlay(); // 使用新的高级橡皮擦系统 // 使用集中化的工具模式切换方法 @@ -2323,7 +2320,7 @@ namespace Ink_Canvas if (sender == EraserByStrokes_Icon && lastBorderMouseDownObject != EraserByStrokes_Icon) return; // 禁用高级橡皮擦系统 - DisableAdvancedEraserSystem(); + DisableEraserOverlay(); forceEraser = true; forcePointEraser = false; @@ -2600,7 +2597,7 @@ namespace Ink_Canvas private void SelectIcon_MouseUp(object sender, RoutedEventArgs e) { // 禁用高级橡皮擦系统 - DisableAdvancedEraserSystem(); + DisableEraserOverlay(); forceEraser = true; drawingShapeMode = 0; diff --git a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs index 922111de..b2840d8a 100644 --- a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs +++ b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs @@ -127,10 +127,7 @@ namespace Ink_Canvas } // 禁用高级橡皮擦系统 - DisableAdvancedEraserSystem(); - - // 修复:从橡皮擦切换到批注模式时,退出多指书写模式 - // 这解决了从橡皮擦切换为批注时被锁定为多指书写的问题 + DisableEraserOverlay(); ExitMultiTouchModeIfNeeded(); // 如果当前已是批注模式,再次点击弹出批注子面板 diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index 117a598a..126581d5 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -45,7 +45,7 @@ namespace Ink_Canvas // 保存图片、媒体元素等非笔画相关的UI元素 if (child is Image || child is MediaElement || - (child is Border border && border.Name != "AdvancedEraserOverlay")) + (child is Border border && border.Name != "EraserOverlayCanvas")) { // 创建元素的深拷贝,避免直接引用导致的问题 var clonedElement = CloneUIElement(child); From e1f10e054c4b219c93f3a5eea3095926e69e0ef4 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 27 Sep 2025 17:09:06 +0800 Subject: [PATCH 067/101] improve:issue #223 --- Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 24d3353e..3bf1f1e5 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -911,6 +911,7 @@ namespace Ink_Canvas /// RoutedEventArgs private void EraserPanelSymbolIconDelete_MouseUp(object sender, RoutedEventArgs e) { + PenIcon_Click(null, null); SymbolIconDelete_MouseUp(null, null); } From fb37d3b9e68611e967d15c4dfecd72867e432d6f Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 27 Sep 2025 17:52:25 +0800 Subject: [PATCH 068/101] =?UTF-8?q?improve:=E6=9B=B4=E6=96=B0=E5=BC=B9?= =?UTF-8?q?=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/GlobalHotkeyManager.cs | 4 +- .../MainWindow_cs/MW_FloatingBarIcons.cs | 25 ++ Ink Canvas/Resources/Styles/Dark.xaml | 9 + Ink Canvas/Resources/Styles/Light.xaml | 9 + Ink Canvas/Windows/HasNewUpdateWindow.xaml | 170 ++++---- Ink Canvas/Windows/HasNewUpdateWindow.xaml.cs | 126 ++++++ Ink Canvas/Windows/HistoryRollbackWindow.xaml | 398 +++++++++--------- .../Windows/HistoryRollbackWindow.xaml.cs | 110 ++++- 8 files changed, 571 insertions(+), 280 deletions(-) diff --git a/Ink Canvas/Helpers/GlobalHotkeyManager.cs b/Ink Canvas/Helpers/GlobalHotkeyManager.cs index 85cee823..917ee3f8 100644 --- a/Ink Canvas/Helpers/GlobalHotkeyManager.cs +++ b/Ink Canvas/Helpers/GlobalHotkeyManager.cs @@ -774,7 +774,7 @@ namespace Ink_Canvas.Helpers return; // 检查鼠标是否在当前窗口所在的屏幕上 - var mousePosition = System.Windows.Forms.Control.MousePosition; + var mousePosition = Control.MousePosition; var currentScreen = Screen.FromPoint(mousePosition); // 无论屏幕是否变化,都检查热键状态 @@ -880,7 +880,7 @@ namespace Ink_Canvas.Helpers // 策略2:在多屏幕环境下,检查鼠标是否在当前窗口所在的屏幕上 if (_isMultiScreenMode) { - var mousePosition = System.Windows.Forms.Control.MousePosition; + var mousePosition = Control.MousePosition; var mouseScreen = Screen.FromPoint(mousePosition); if (mouseScreen == _currentScreen) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 3bf1f1e5..7b4b48e5 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -2700,6 +2700,19 @@ namespace Ink_Canvas public void BtnExit_Click(object sender, RoutedEventArgs e) { + // 如果当前在设置面板中,需要先恢复无焦点模式状态 + if (BorderSettings.Visibility == Visibility.Visible) + { + // 如果用户没有在设置中修改无焦点模式,则恢复之前的状态 + if (!userChangedNoFocusModeInSettings && wasNoFocusModeBeforeSettings) + { + Settings.Advanced.IsNoFocusMode = true; + ToggleSwitchNoFocusMode.IsOn = true; + ApplyNoFocusMode(); + } + SaveSettingsToFile(); + } + App.IsAppExitByUser = true; // 不设置 CloseIsFromButton = true,让它也经过确认流程 Close(); @@ -2707,6 +2720,18 @@ namespace Ink_Canvas public void BtnRestart_Click(object sender, RoutedEventArgs e) { + if (BorderSettings.Visibility == Visibility.Visible) + { + // 如果用户没有在设置中修改无焦点模式,则恢复之前的状态 + if (!userChangedNoFocusModeInSettings && wasNoFocusModeBeforeSettings) + { + Settings.Advanced.IsNoFocusMode = true; + ToggleSwitchNoFocusMode.IsOn = true; + ApplyNoFocusMode(); + } + SaveSettingsToFile(); + } + Process.Start(System.Windows.Forms.Application.ExecutablePath, "-m"); App.IsAppExitByUser = true; // 不设置 CloseIsFromButton = true,让它也经过确认流程 diff --git a/Ink Canvas/Resources/Styles/Dark.xaml b/Ink Canvas/Resources/Styles/Dark.xaml index e04f7855..3a5f14bb 100644 --- a/Ink Canvas/Resources/Styles/Dark.xaml +++ b/Ink Canvas/Resources/Styles/Dark.xaml @@ -29,4 +29,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/Ink Canvas/Resources/Styles/Light.xaml b/Ink Canvas/Resources/Styles/Light.xaml index bcf1db1f..00943f56 100644 --- a/Ink Canvas/Resources/Styles/Light.xaml +++ b/Ink Canvas/Resources/Styles/Light.xaml @@ -29,4 +29,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/Ink Canvas/Windows/HasNewUpdateWindow.xaml b/Ink Canvas/Windows/HasNewUpdateWindow.xaml index 793d028c..bc7620b0 100644 --- a/Ink Canvas/Windows/HasNewUpdateWindow.xaml +++ b/Ink Canvas/Windows/HasNewUpdateWindow.xaml @@ -7,61 +7,68 @@ xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern" xmlns:mdxam="clr-namespace:MdXaml;assembly=MdXaml" mc:Ignorable="d" - ui:WindowHelper.UseModernWindowStyle = "False" + ui:WindowHelper.UseModernWindowStyle="False" ui:WindowHelper.SystemBackdropType="Mica" Title="InkCanvasForClass CE有新版本可用" Height="650" Width="900" ResizeMode="NoResize" - WindowStartupLocation="CenterScreen" WindowStyle="None" AllowsTransparency="True" + WindowStartupLocation="CenterScreen" WindowStyle="None" Background="Transparent"> - + - + + + + + + + + + + + - - + + - - - - - - + + + + - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - + SelectionChanged="VersionComboBox_SelectionChanged"/> + + + + + + + + + + + + + + + + + + + + + + + + @@ -91,18 +91,18 @@ diff --git a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs index a90e6b1d..588af4b9 100644 --- a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs +++ b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs @@ -1,4 +1,5 @@ using Ink_Canvas.Helpers; +using Ink_Canvas.Resources; using System; using System.Media; using System.Timers; @@ -6,6 +7,7 @@ using System.Windows; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; +using System.Windows.Media.Imaging; namespace Ink_Canvas { @@ -21,6 +23,7 @@ namespace Ink_Canvas timer.Elapsed += Timer_Elapsed; timer.Interval = 50; + InitializeUI(); } private void Timer_Elapsed(object sender, ElapsedEventArgs e) @@ -62,24 +65,25 @@ namespace Ink_Canvas Application.Current.Dispatcher.Invoke(() => { //Play sound - player.Stream = Properties.Resources.TimerDownNotice; - player.Play(); + PlayTimerSound(); }); } } SoundPlayer player = new SoundPlayer(); + MediaPlayer mediaPlayer = new MediaPlayer(); - int hour = 0; + int hour; int minute = 1; - int second = 0; + int second; int totalSeconds = 60; DateTime startTime = DateTime.Now; DateTime pauseTime = DateTime.Now; - bool isTimerRunning = false; - bool isPaused = false; + bool isTimerRunning; + bool isPaused; + bool useLegacyUI; Timer timer = new Timer(); @@ -334,6 +338,97 @@ namespace Ink_Canvas } } + private void InitializeUI() + { + // 从设置中读取配置 + if (MainWindow.Settings.RandSettings != null) + { + useLegacyUI = MainWindow.Settings.RandSettings.UseLegacyTimerUI; + UpdateButtonTexts(); + } + } + + public void RefreshUI() + { + InitializeUI(); + } + + private void UpdateButtonTexts() + { + if (useLegacyUI) + { + // 老版UI:使用+5, +1, -1, -5 + HourPlus5Text.Text = "+5"; + HourPlus1Text.Text = "+1"; + HourMinus1Text.Text = "-1"; + HourMinus5Text.Text = "-5"; + + MinutePlus5Text.Text = "+5"; + MinutePlus1Text.Text = "+1"; + MinuteMinus1Text.Text = "-1"; + MinuteMinus5Text.Text = "-5"; + + SecondPlus5Text.Text = "+5"; + SecondPlus1Text.Text = "+1"; + SecondMinus1Text.Text = "-1"; + SecondMinus5Text.Text = "-5"; + } + else + { + // 新版UI:使用箭头符号 + HourPlus5Text.Text = "∧∧"; + HourPlus1Text.Text = "∧"; + HourMinus1Text.Text = "∨"; + HourMinus5Text.Text = "∨∨"; + + MinutePlus5Text.Text = "∧∧"; + MinutePlus1Text.Text = "∧"; + MinuteMinus1Text.Text = "∨"; + MinuteMinus5Text.Text = "∨∨"; + + SecondPlus5Text.Text = "∧∧"; + SecondPlus1Text.Text = "∧"; + SecondMinus1Text.Text = "∨"; + SecondMinus5Text.Text = "∨∨"; + } + } + + private void PlayTimerSound() + { + try + { + double volume = MainWindow.Settings.RandSettings?.TimerVolume ?? 1.0; + mediaPlayer.Volume = volume; + + if (!string.IsNullOrEmpty(MainWindow.Settings.RandSettings?.CustomTimerSoundPath) && + System.IO.File.Exists(MainWindow.Settings.RandSettings.CustomTimerSoundPath)) + { + // 播放自定义铃声 + mediaPlayer.Open(new Uri(MainWindow.Settings.RandSettings.CustomTimerSoundPath)); + } + else + { + // 播放默认铃声 + string tempPath = System.IO.Path.GetTempFileName() + ".wav"; + using (var stream = Properties.Resources.TimerDownNotice) + { + using (var fileStream = new System.IO.FileStream(tempPath, System.IO.FileMode.Create)) + { + stream.CopyTo(fileStream); + } + } + mediaPlayer.Open(new Uri(tempPath)); + } + + mediaPlayer.Play(); + } + catch (Exception ex) + { + // 如果播放失败,静默处理 + System.Diagnostics.Debug.WriteLine($"播放计时器铃声失败: {ex.Message}"); + } + } + private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { isTimerRunning = false; @@ -344,7 +439,7 @@ namespace Ink_Canvas Close(); } - private bool _isInCompact = false; + private bool _isInCompact; private void BtnMinimal_OnMouseUp(object sender, MouseButtonEventArgs e) { diff --git a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs index 583f1021..2b9f621b 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs @@ -398,7 +398,7 @@ namespace Ink_Canvas.Windows ((Border)border).Background = new SolidColorBrush(Color.FromRgb(138, 138, 138)); } - private Border _sidebarItemMouseDownBorder = null; + private Border _sidebarItemMouseDownBorder; private void SidebarItem_MouseDown(object sender, MouseButtonEventArgs e) { @@ -999,7 +999,7 @@ namespace Ink_Canvas.Windows public Image ThumbImage { get; set; } public Border TrackBorder { get; set; } public Border ValueBorder { get; set; } - public bool IsTouchCaptured { get; set; } = false; + public bool IsTouchCaptured { get; set; } } #endregion From 69c45764b2183c7e05667d81d15b68a33fe7bdc6 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 1 Oct 2025 00:53:22 +0800 Subject: [PATCH 091/101] Revert "add:issue #224" This reverts commit 07a62d2f78d5de758dcdbebf2780a88d2e6ab065. --- Ink Canvas/App.xaml.cs | 2 +- .../Helpers/FloatingWindowInterceptor.cs | 2 +- Ink Canvas/Helpers/GlobalHotkeyManager.cs | 6 +- Ink Canvas/Helpers/MultiTouchInput.cs | 2 +- Ink Canvas/Helpers/PPTInkManager.cs | 2 +- Ink Canvas/MainWindow.xaml | 33 ------ .../MainWindow_cs/MW_ElementsControls.cs | 2 +- Ink Canvas/MainWindow_cs/MW_Eraser.cs | 10 +- Ink Canvas/MainWindow_cs/MW_PPT.cs | 4 +- .../MainWindow_cs/MW_SelectionGestures.cs | 4 +- Ink Canvas/MainWindow_cs/MW_Settings.cs | 38 ------ Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs | 6 - Ink Canvas/MainWindow_cs/MW_Timer.cs | 4 +- Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 3 +- Ink Canvas/Resources/Settings.cs | 26 ++--- Ink Canvas/Windows/CountdownTimerWindow.xaml | 24 ++-- .../Windows/CountdownTimerWindow.xaml.cs | 109 ++---------------- .../SettingsViews/SettingsWindow.xaml.cs | 4 +- 18 files changed, 52 insertions(+), 229 deletions(-) diff --git a/Ink Canvas/App.xaml.cs b/Ink Canvas/App.xaml.cs index 0bfdd393..2e4f8e12 100644 --- a/Ink Canvas/App.xaml.cs +++ b/Ink Canvas/App.xaml.cs @@ -35,7 +35,7 @@ namespace Ink_Canvas public static string RootPath = Environment.GetEnvironmentVariable("APPDATA") + "\\Ink Canvas\\"; // 新增:标记是否通过--board参数启动 - public static bool StartWithBoardMode; + public static bool StartWithBoardMode = false; // 新增:保存看门狗进程对象 private static Process watchdogProcess; // 新增:标记是否为软件内主动退出 diff --git a/Ink Canvas/Helpers/FloatingWindowInterceptor.cs b/Ink Canvas/Helpers/FloatingWindowInterceptor.cs index e6a63c31..665099e2 100644 --- a/Ink Canvas/Helpers/FloatingWindowInterceptor.cs +++ b/Ink Canvas/Helpers/FloatingWindowInterceptor.cs @@ -229,7 +229,7 @@ namespace Ink_Canvas.Helpers private readonly Dictionary _lastScanTime = new Dictionary(); private readonly HashSet _knownWindows = new HashSet(); private readonly Dictionary _processLastScanTime = new Dictionary(); - private int _consecutiveEmptyScans; + private int _consecutiveEmptyScans = 0; private DateTime _lastSuccessfulScan = DateTime.Now; private readonly object _scanLock = new object(); diff --git a/Ink Canvas/Helpers/GlobalHotkeyManager.cs b/Ink Canvas/Helpers/GlobalHotkeyManager.cs index ffd2a48b..917ee3f8 100644 --- a/Ink Canvas/Helpers/GlobalHotkeyManager.cs +++ b/Ink Canvas/Helpers/GlobalHotkeyManager.cs @@ -24,12 +24,12 @@ namespace Ink_Canvas.Helpers // 多屏幕支持相关字段 private Screen _currentScreen; - private bool _isMultiScreenMode; + private bool _isMultiScreenMode = false; private bool _enableScreenSpecificHotkeys = true; // 是否启用基于屏幕的热键注册 // 智能热键管理相关字段 - private bool _isWindowFocused; - private bool _isMouseOverWindow; + private bool _isWindowFocused = false; + private bool _isMouseOverWindow = false; private System.Windows.Threading.DispatcherTimer _mousePositionTimer; // 配置文件路径 diff --git a/Ink Canvas/Helpers/MultiTouchInput.cs b/Ink Canvas/Helpers/MultiTouchInput.cs index 4cc6f680..9764d2ca 100644 --- a/Ink Canvas/Helpers/MultiTouchInput.cs +++ b/Ink Canvas/Helpers/MultiTouchInput.cs @@ -30,7 +30,7 @@ namespace Ink_Canvas.Helpers public class StrokeVisual : DrawingVisual { private bool _needsRedraw = true; - private int _lastPointCount; + private int _lastPointCount = 0; private const int REDRAW_THRESHOLD = 3; /// diff --git a/Ink Canvas/Helpers/PPTInkManager.cs b/Ink Canvas/Helpers/PPTInkManager.cs index 57aa05b5..2fee446c 100644 --- a/Ink Canvas/Helpers/PPTInkManager.cs +++ b/Ink Canvas/Helpers/PPTInkManager.cs @@ -37,7 +37,7 @@ namespace Ink_Canvas.Helpers private const int MinSwitchIntervalMs = 100; // 最小切换间隔100毫秒 // 内存管理相关字段 - private long _totalMemoryUsage; + private long _totalMemoryUsage = 0; private const long MaxMemoryUsageBytes = 100 * 1024 * 1024; // 100MB限制 private DateTime _lastMemoryCleanup = DateTime.MinValue; private const int MemoryCleanupIntervalMinutes = 5; // 5分钟清理一次 diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index e9512fcb..49b07dd6 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -3242,39 +3242,6 @@ FontFamily="Consolas" Text="{Binding ElementName=RandWindowOnceMaxStudentsSlider, Path=Value, Converter={StaticResource IntNumberToString}}" /> - - - - - - - - - - - - - - /// 保存画布上的非笔画元素(如图片、媒体元素等) diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs index 690e657c..5b62785b 100644 --- a/Ink Canvas/Resources/Settings.cs +++ b/Ink Canvas/Resources/Settings.cs @@ -91,7 +91,7 @@ namespace Ink_Canvas [JsonProperty("enablePalmEraser")] public bool EnablePalmEraser { get; set; } = true; [JsonProperty("palmEraserSensitivity")] - public int PalmEraserSensitivity { get; set; } // 0-低敏感度, 1-中敏感度, 2-高敏感度 + public int PalmEraserSensitivity { get; set; } = 0; // 0-低敏感度, 1-中敏感度, 2-高敏感度 [JsonProperty("clearCanvasAlsoClearImages")] public bool ClearCanvasAlsoClearImages { get; set; } = true; [JsonProperty("showCircleCenter")] @@ -99,7 +99,7 @@ namespace Ink_Canvas // 墨迹渐隐功能设置 [JsonProperty("enableInkFade")] - public bool EnableInkFade { get; set; } + public bool EnableInkFade { get; set; } = false; [JsonProperty("inkFadeTime")] public int InkFadeTime { get; set; } = 3000; // 墨迹渐隐时间(毫秒) @@ -236,7 +236,7 @@ namespace Ink_Canvas public int QuickColorPaletteDisplayMode { get; set; } = 1; [JsonProperty("enableHotkeysInMouseMode")] - public bool EnableHotkeysInMouseMode { get; set; } + public bool EnableHotkeysInMouseMode { get; set; } = false; } @@ -310,9 +310,9 @@ namespace Ink_Canvas [JsonProperty("isAlwaysGoToFirstPageOnReenter")] public bool IsAlwaysGoToFirstPageOnReenter { get; set; } [JsonProperty("enablePowerPointEnhancement")] - public bool EnablePowerPointEnhancement { get; set; } + public bool EnablePowerPointEnhancement { get; set; } = false; [JsonProperty("showGestureButtonInSlideShow")] - public bool ShowGestureButtonInSlideShow { get; set; } + public bool ShowGestureButtonInSlideShow { get; set; } = false; } public class Automation @@ -452,7 +452,7 @@ namespace Ink_Canvas public int AutoDelSavedFilesDaysThreshold = 15; [JsonProperty("keepFoldAfterSoftwareExit")] - public bool KeepFoldAfterSoftwareExit { get; set; } + public bool KeepFoldAfterSoftwareExit { get; set; } = false; [JsonProperty("isSaveFullPageStrokes")] public bool IsSaveFullPageStrokes; @@ -467,13 +467,13 @@ namespace Ink_Canvas public class FloatingWindowInterceptorSettings { [JsonProperty("isEnabled")] - public bool IsEnabled { get; set; } + public bool IsEnabled { get; set; } = false; [JsonProperty("scanIntervalMs")] public int ScanIntervalMs { get; set; } = 5000; [JsonProperty("autoStart")] - public bool AutoStart { get; set; } + public bool AutoStart { get; set; } = false; [JsonProperty("showNotifications")] public bool ShowNotifications { get; set; } = true; @@ -622,17 +622,11 @@ namespace Ink_Canvas [JsonProperty("directCallCiRand")] public bool DirectCallCiRand { get; set; } [JsonProperty("externalCallerType")] - public int ExternalCallerType { get; set; } + public int ExternalCallerType { get; set; } = 0; [JsonProperty("selectedBackgroundIndex")] public int SelectedBackgroundIndex { get; set; } [JsonProperty("customPickNameBackgrounds")] public List CustomPickNameBackgrounds { get; set; } = new List(); - [JsonProperty("useLegacyTimerUI")] - public bool UseLegacyTimerUI { get; set; } - [JsonProperty("timerVolume")] - public double TimerVolume { get; set; } = 1.0; - [JsonProperty("customTimerSoundPath")] - public string CustomTimerSoundPath { get; set; } = ""; } public class CustomPickNameBackground @@ -674,6 +668,6 @@ namespace Ink_Canvas public class ModeSettings { [JsonProperty("isPPTOnlyMode")] - public bool IsPPTOnlyMode { get; set; } // 是否为仅PPT模式,默认为false(正常模式) + public bool IsPPTOnlyMode { get; set; } = false; // 是否为仅PPT模式,默认为false(正常模式) } } diff --git a/Ink Canvas/Windows/CountdownTimerWindow.xaml b/Ink Canvas/Windows/CountdownTimerWindow.xaml index 0f820a2d..6fed4d88 100644 --- a/Ink Canvas/Windows/CountdownTimerWindow.xaml +++ b/Ink Canvas/Windows/CountdownTimerWindow.xaml @@ -44,18 +44,18 @@ @@ -91,18 +91,18 @@ diff --git a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs index 588af4b9..a90e6b1d 100644 --- a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs +++ b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs @@ -1,5 +1,4 @@ using Ink_Canvas.Helpers; -using Ink_Canvas.Resources; using System; using System.Media; using System.Timers; @@ -7,7 +6,6 @@ using System.Windows; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; -using System.Windows.Media.Imaging; namespace Ink_Canvas { @@ -23,7 +21,6 @@ namespace Ink_Canvas timer.Elapsed += Timer_Elapsed; timer.Interval = 50; - InitializeUI(); } private void Timer_Elapsed(object sender, ElapsedEventArgs e) @@ -65,25 +62,24 @@ namespace Ink_Canvas Application.Current.Dispatcher.Invoke(() => { //Play sound - PlayTimerSound(); + player.Stream = Properties.Resources.TimerDownNotice; + player.Play(); }); } } SoundPlayer player = new SoundPlayer(); - MediaPlayer mediaPlayer = new MediaPlayer(); - int hour; + int hour = 0; int minute = 1; - int second; + int second = 0; int totalSeconds = 60; DateTime startTime = DateTime.Now; DateTime pauseTime = DateTime.Now; - bool isTimerRunning; - bool isPaused; - bool useLegacyUI; + bool isTimerRunning = false; + bool isPaused = false; Timer timer = new Timer(); @@ -338,97 +334,6 @@ namespace Ink_Canvas } } - private void InitializeUI() - { - // 从设置中读取配置 - if (MainWindow.Settings.RandSettings != null) - { - useLegacyUI = MainWindow.Settings.RandSettings.UseLegacyTimerUI; - UpdateButtonTexts(); - } - } - - public void RefreshUI() - { - InitializeUI(); - } - - private void UpdateButtonTexts() - { - if (useLegacyUI) - { - // 老版UI:使用+5, +1, -1, -5 - HourPlus5Text.Text = "+5"; - HourPlus1Text.Text = "+1"; - HourMinus1Text.Text = "-1"; - HourMinus5Text.Text = "-5"; - - MinutePlus5Text.Text = "+5"; - MinutePlus1Text.Text = "+1"; - MinuteMinus1Text.Text = "-1"; - MinuteMinus5Text.Text = "-5"; - - SecondPlus5Text.Text = "+5"; - SecondPlus1Text.Text = "+1"; - SecondMinus1Text.Text = "-1"; - SecondMinus5Text.Text = "-5"; - } - else - { - // 新版UI:使用箭头符号 - HourPlus5Text.Text = "∧∧"; - HourPlus1Text.Text = "∧"; - HourMinus1Text.Text = "∨"; - HourMinus5Text.Text = "∨∨"; - - MinutePlus5Text.Text = "∧∧"; - MinutePlus1Text.Text = "∧"; - MinuteMinus1Text.Text = "∨"; - MinuteMinus5Text.Text = "∨∨"; - - SecondPlus5Text.Text = "∧∧"; - SecondPlus1Text.Text = "∧"; - SecondMinus1Text.Text = "∨"; - SecondMinus5Text.Text = "∨∨"; - } - } - - private void PlayTimerSound() - { - try - { - double volume = MainWindow.Settings.RandSettings?.TimerVolume ?? 1.0; - mediaPlayer.Volume = volume; - - if (!string.IsNullOrEmpty(MainWindow.Settings.RandSettings?.CustomTimerSoundPath) && - System.IO.File.Exists(MainWindow.Settings.RandSettings.CustomTimerSoundPath)) - { - // 播放自定义铃声 - mediaPlayer.Open(new Uri(MainWindow.Settings.RandSettings.CustomTimerSoundPath)); - } - else - { - // 播放默认铃声 - string tempPath = System.IO.Path.GetTempFileName() + ".wav"; - using (var stream = Properties.Resources.TimerDownNotice) - { - using (var fileStream = new System.IO.FileStream(tempPath, System.IO.FileMode.Create)) - { - stream.CopyTo(fileStream); - } - } - mediaPlayer.Open(new Uri(tempPath)); - } - - mediaPlayer.Play(); - } - catch (Exception ex) - { - // 如果播放失败,静默处理 - System.Diagnostics.Debug.WriteLine($"播放计时器铃声失败: {ex.Message}"); - } - } - private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { isTimerRunning = false; @@ -439,7 +344,7 @@ namespace Ink_Canvas Close(); } - private bool _isInCompact; + private bool _isInCompact = false; private void BtnMinimal_OnMouseUp(object sender, MouseButtonEventArgs e) { diff --git a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs index 2b9f621b..583f1021 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs @@ -398,7 +398,7 @@ namespace Ink_Canvas.Windows ((Border)border).Background = new SolidColorBrush(Color.FromRgb(138, 138, 138)); } - private Border _sidebarItemMouseDownBorder; + private Border _sidebarItemMouseDownBorder = null; private void SidebarItem_MouseDown(object sender, MouseButtonEventArgs e) { @@ -999,7 +999,7 @@ namespace Ink_Canvas.Windows public Image ThumbImage { get; set; } public Border TrackBorder { get; set; } public Border ValueBorder { get; set; } - public bool IsTouchCaptured { get; set; } + public bool IsTouchCaptured { get; set; } = false; } #endregion From c91b8a1a7a9376c3c5258ee82145826fe5729ddd Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 1 Oct 2025 00:54:03 +0800 Subject: [PATCH 092/101] add:issue #224 --- Ink Canvas/MainWindow.xaml | 33 +++++++ Ink Canvas/MainWindow_cs/MW_Settings.cs | 38 +++++++ Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs | 6 ++ Ink Canvas/Resources/Settings.cs | 6 ++ Ink Canvas/Windows/CountdownTimerWindow.xaml | 24 ++--- .../Windows/CountdownTimerWindow.xaml.cs | 99 ++++++++++++++++++- 6 files changed, 192 insertions(+), 14 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 49b07dd6..e9512fcb 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -3242,6 +3242,39 @@ FontFamily="Consolas" Text="{Binding ElementName=RandWindowOnceMaxStudentsSlider, Path=Value, Converter={StaticResource IntNumberToString}}" /> + + + + + + + + + + + + + + @@ -91,18 +91,18 @@ diff --git a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs index a90e6b1d..f3fd787f 100644 --- a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs +++ b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs @@ -1,4 +1,5 @@ using Ink_Canvas.Helpers; +using Ink_Canvas.Resources; using System; using System.Media; using System.Timers; @@ -6,6 +7,7 @@ using System.Windows; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; +using System.Windows.Media.Imaging; namespace Ink_Canvas { @@ -21,6 +23,7 @@ namespace Ink_Canvas timer.Elapsed += Timer_Elapsed; timer.Interval = 50; + InitializeUI(); } private void Timer_Elapsed(object sender, ElapsedEventArgs e) @@ -62,13 +65,13 @@ namespace Ink_Canvas Application.Current.Dispatcher.Invoke(() => { //Play sound - player.Stream = Properties.Resources.TimerDownNotice; - player.Play(); + PlayTimerSound(); }); } } SoundPlayer player = new SoundPlayer(); + MediaPlayer mediaPlayer = new MediaPlayer(); int hour = 0; int minute = 1; @@ -80,6 +83,7 @@ namespace Ink_Canvas bool isTimerRunning = false; bool isPaused = false; + bool useLegacyUI = false; Timer timer = new Timer(); @@ -334,6 +338,97 @@ namespace Ink_Canvas } } + private void InitializeUI() + { + // 从设置中读取配置 + if (MainWindow.Settings.RandSettings != null) + { + useLegacyUI = MainWindow.Settings.RandSettings.UseLegacyTimerUI; + UpdateButtonTexts(); + } + } + + public void RefreshUI() + { + InitializeUI(); + } + + private void UpdateButtonTexts() + { + if (useLegacyUI) + { + // 老版UI:使用+5, +1, -1, -5 + HourPlus5Text.Text = "+5"; + HourPlus1Text.Text = "+1"; + HourMinus1Text.Text = "-1"; + HourMinus5Text.Text = "-5"; + + MinutePlus5Text.Text = "+5"; + MinutePlus1Text.Text = "+1"; + MinuteMinus1Text.Text = "-1"; + MinuteMinus5Text.Text = "-5"; + + SecondPlus5Text.Text = "+5"; + SecondPlus1Text.Text = "+1"; + SecondMinus1Text.Text = "-1"; + SecondMinus5Text.Text = "-5"; + } + else + { + // 新版UI:使用箭头符号 + HourPlus5Text.Text = "∧∧"; + HourPlus1Text.Text = "∧"; + HourMinus1Text.Text = "∨"; + HourMinus5Text.Text = "∨∨"; + + MinutePlus5Text.Text = "∧∧"; + MinutePlus1Text.Text = "∧"; + MinuteMinus1Text.Text = "∨"; + MinuteMinus5Text.Text = "∨∨"; + + SecondPlus5Text.Text = "∧∧"; + SecondPlus1Text.Text = "∧"; + SecondMinus1Text.Text = "∨"; + SecondMinus5Text.Text = "∨∨"; + } + } + + private void PlayTimerSound() + { + try + { + double volume = MainWindow.Settings.RandSettings?.TimerVolume ?? 1.0; + mediaPlayer.Volume = volume; + + if (!string.IsNullOrEmpty(MainWindow.Settings.RandSettings?.CustomTimerSoundPath) && + System.IO.File.Exists(MainWindow.Settings.RandSettings.CustomTimerSoundPath)) + { + // 播放自定义铃声 + mediaPlayer.Open(new Uri(MainWindow.Settings.RandSettings.CustomTimerSoundPath)); + } + else + { + // 播放默认铃声 + string tempPath = System.IO.Path.GetTempFileName() + ".wav"; + using (var stream = Properties.Resources.TimerDownNotice) + { + using (var fileStream = new System.IO.FileStream(tempPath, System.IO.FileMode.Create)) + { + stream.CopyTo(fileStream); + } + } + mediaPlayer.Open(new Uri(tempPath)); + } + + mediaPlayer.Play(); + } + catch (Exception ex) + { + // 如果播放失败,静默处理 + System.Diagnostics.Debug.WriteLine($"播放计时器铃声失败: {ex.Message}"); + } + } + private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { isTimerRunning = false; From 851bd1c3c68590615e4eec1fe3e847030e39b866 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 1 Oct 2025 09:13:48 +0800 Subject: [PATCH 093/101] =?UTF-8?q?improve:=E4=B8=BB=E9=A2=98=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/InkCanvasForClass.csproj | 9 +++++ Ink Canvas/MainWindow.xaml | 32 ++++++++-------- Ink Canvas/MainWindow_cs/MW_AutoTheme.cs | 35 ++++++++++++++++++ ...c_fluent_people_money_24_regular-light.png | Bin 0 -> 11718 bytes ...c_fluent_person_money_24_regular-light.png | Bin 0 -> 9183 bytes .../ic_fluent_timer_24_regular-light.png | Bin 0 -> 8687 bytes Ink Canvas/Resources/Styles/Dark.xaml | 9 +++++ Ink Canvas/Resources/Styles/Light.xaml | 9 +++++ .../Resources/new-icons/blackboard-light.png | Bin 0 -> 643 bytes .../new-icons/chevron-left-light.png | Bin 0 -> 309 bytes .../new-icons/end-slides-show-light.png | Bin 0 -> 820 bytes Ink Canvas/Resources/new-icons/eye-light.png | Bin 0 -> 1053 bytes 12 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 Ink Canvas/Resources/Icons-Fluent/ic_fluent_people_money_24_regular-light.png create mode 100644 Ink Canvas/Resources/Icons-Fluent/ic_fluent_person_money_24_regular-light.png create mode 100644 Ink Canvas/Resources/Icons-Fluent/ic_fluent_timer_24_regular-light.png create mode 100644 Ink Canvas/Resources/new-icons/blackboard-light.png create mode 100644 Ink Canvas/Resources/new-icons/chevron-left-light.png create mode 100644 Ink Canvas/Resources/new-icons/end-slides-show-light.png create mode 100644 Ink Canvas/Resources/new-icons/eye-light.png diff --git a/Ink Canvas/InkCanvasForClass.csproj b/Ink Canvas/InkCanvasForClass.csproj index 8dc5b359..5ff02806 100644 --- a/Ink Canvas/InkCanvasForClass.csproj +++ b/Ink Canvas/InkCanvasForClass.csproj @@ -493,6 +493,15 @@ + + + + + + + + + diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index e9512fcb..68132647 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -9578,7 +9578,7 @@ @@ -9592,7 +9592,7 @@ MouseUp="SymbolIconRandOne_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - @@ -9600,7 +9600,7 @@ MouseUp="SymbolIconRand_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - @@ -9608,7 +9608,7 @@ MouseUp="ImageCountdownTimer_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - @@ -9616,7 +9616,7 @@ MouseUp="ImageBlackboard_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - @@ -9625,7 +9625,7 @@ MouseUp="ExitPPTSlideShow_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0" Visibility="Collapsed"> - @@ -9634,7 +9634,7 @@ MouseUp="UnFoldFloatingBar_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - @@ -9642,7 +9642,7 @@ MouseUp="HideQuickPanel_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - @@ -9654,7 +9654,7 @@ @@ -9675,7 +9675,7 @@ MouseUp="SymbolIconRandOne_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - @@ -9683,7 +9683,7 @@ MouseUp="SymbolIconRand_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - @@ -9691,7 +9691,7 @@ MouseUp="ImageCountdownTimer_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - @@ -9699,7 +9699,7 @@ MouseUp="ImageBlackboard_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - @@ -9708,7 +9708,7 @@ MouseUp="ExitPPTSlideShow_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0" Visibility="Collapsed"> - @@ -9717,7 +9717,7 @@ MouseUp="UnFoldFloatingBar_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - @@ -9725,7 +9725,7 @@ MouseUp="HideQuickPanel_MouseUp" Background="Transparent" Orientation="Vertical" HorizontalAlignment="Center" Width="32" Margin="0"> - diff --git a/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs b/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs index 63949a51..a797d793 100644 --- a/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs +++ b/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs @@ -54,6 +54,9 @@ namespace Ink_Canvas InitializeFloatBarForegroundColor(); + // 刷新快速面板图标 + RefreshQuickPanelIcons(); + // 强制刷新UI window.InvalidateVisual(); } @@ -79,6 +82,9 @@ namespace Ink_Canvas InitializeFloatBarForegroundColor(); + // 刷新快速面板图标 + RefreshQuickPanelIcons(); + // 强制刷新UI window.InvalidateVisual(); } @@ -103,6 +109,35 @@ namespace Ink_Canvas } } + /// + /// 刷新快速面板图标 + /// + private void RefreshQuickPanelIcons() + { + try + { + if (LeftUnFoldButtonQuickPanel != null) + { + LeftUnFoldButtonQuickPanel.InvalidateVisual(); + } + if (RightUnFoldButtonQuickPanel != null) + { + RightUnFoldButtonQuickPanel.InvalidateVisual(); + } + if (LeftSidePanel != null) + { + LeftSidePanel.InvalidateVisual(); + } + if (RightSidePanel != null) + { + RightSidePanel.InvalidateVisual(); + } + } + catch (Exception) + { + } + } + /// /// 刷新浮动工具栏按钮颜色 /// diff --git a/Ink Canvas/Resources/Icons-Fluent/ic_fluent_people_money_24_regular-light.png b/Ink Canvas/Resources/Icons-Fluent/ic_fluent_people_money_24_regular-light.png new file mode 100644 index 0000000000000000000000000000000000000000..a4bdd0e7b813faf698277a44f46b44a6c1765829 GIT binary patch literal 11718 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 Q122-ij0&Vo>aE}Z0q_?lga7~l literal 0 HcmV?d00001 diff --git a/Ink Canvas/Resources/Styles/Dark.xaml b/Ink Canvas/Resources/Styles/Dark.xaml index 3a5f14bb..004a6143 100644 --- a/Ink Canvas/Resources/Styles/Dark.xaml +++ b/Ink Canvas/Resources/Styles/Dark.xaml @@ -38,4 +38,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/Ink Canvas/Resources/Styles/Light.xaml b/Ink Canvas/Resources/Styles/Light.xaml index 00943f56..72389c2c 100644 --- a/Ink Canvas/Resources/Styles/Light.xaml +++ b/Ink Canvas/Resources/Styles/Light.xaml @@ -38,4 +38,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/Ink Canvas/Resources/new-icons/blackboard-light.png b/Ink Canvas/Resources/new-icons/blackboard-light.png new file mode 100644 index 0000000000000000000000000000000000000000..c1bbcde6fdc014313cd34ae1732a085915a48821 GIT binary patch literal 643 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!Wi-X*q7}lMWc?smOq&xaLGB9lH z=l+w(3gmkP_=LCu>D{|`@7lEsLhj$cAIN}!JzxM~!^L;*+zC+(m)*X7J5aEyRiOxI zmPARAUoeA1LVdnM|NH;<=NB{xtl!^n?;jszG65Dx zffj|QE4|#N3M8&P?>pP|`t=E1MJK1k?{GTfe&0Z4^6a(+ryYN7W@eFHmmz^BZ5_?7pb8%%wug(-NC+En4Ddy~rc{;SuDy(@Mit)i z8s=JAAsUk{i>=%xH&`WYP+|)_qR=JbBG{~vB;d-ksKZgjumdRgZ)YRl6N&SGJB^Mz z%x-=$FV<#aV!&gWSC=FCUb5}^_h!RV;g@V@ek)e-oHFQ8;e94JiFe+W=LXLor7(Yq zkC@XY9&7&nD36ooF{bjx)pJcP0-Jk4*_`DWI?4jyCJ%Aawhz?D2l}3|7O!dW&;@+pjvxadA%w vC_7`>yCdsk?rGnwcbP0l+XkKUsW16 literal 0 HcmV?d00001 diff --git a/Ink Canvas/Resources/new-icons/chevron-left-light.png b/Ink Canvas/Resources/new-icons/chevron-left-light.png new file mode 100644 index 0000000000000000000000000000000000000000..b83607dd2dc85a6935068b7303902402a390f308 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6-M0X`wFKzjfF{kxICu3fvfZ{NP|_!CZ`97jozUoeBh{`dda8z@}#p1=YW z<1FxqEM{QP@d9DS@~RSFpx`7=7srr@!*8z{axoc-xL(YEyycLNqqzX*vhunz18#vd z=BD55e?4s{M4#GoJ>Jh_){JGD$8Wxj($~0gN0{^6&A*;a@(;KFmVfImeb*Gk&Sf#+GKhvcg|9Q_HYin@7lF%_wL<$_Ur+&fed7@bLUQ=I8XtQ1cL3`w?h;|NVrO% zvb}rvW+;6A1~gHsB*-tAK_H<%K%wA&gF}D+{QUU)3I^}(*Y7{?A1~iN>%&8!D$W9r z$YKTt9WM}OEUzl@Wnf_P^mK6y$#8x<^X8-`0|D2_lmf@*z7?PU+goXwFWk)da!J;y zm2=E@t*vHpX5V@u#pr+Mrd7h5G6h!u$P(V{YLF4&cY^Pta&?Gsk;4~{_ADnWmwuT* z-xHh{m6tkLN-~|Cw9k8$K)cYv7AaquO%5)-&U1At8as48GW20GdF(m|`BJkS>Tb_k-cU5*L64E)ia+0^MLAC;PWM>q zd3ehFCqgT;Rd|Ezc319iXsDX8V8sOqUX}R!!Ep-&H7@XM{u#q)dgj??)*}lFo_=QC zc5tS=q5v=AJN;SN=tbQNg+^uoH@^;J;@6hI85Uf|3 z5Pz)j1e2h<%&QYypZ{pvJxxgPSQo=5!HczZt0%m_`0q=+$KRv>9&MWB<|lgIRpNr! zJL8xolY$E!4z}31akCw}P^##!D3slxvFxCvYrh4%XPs2ZeHMkrM6>^vhn4E53%!eO z2)g?ritX?&)_eC~J3nXQ4tx;sJixwA-~ij{8|CsxC$n~^98{9m`Y~&!pZT+U?l+ZA zAC}Wk-u&aa-x23?vw4g59En@<((%CIPk-VQ5}7~cf5@JB|Iv{%Z2MFd|8U%h(u%9SfX5*b_r1E9$H^XGwTfIJ`@LIM>78J8|yf(yb8 z(SLgE0MJnBk|4ie28D$F_4nWZKfgb~K)~Vt{0R;5^7i@l>l6I-nW~oU0xIJy@Q5sC zV9@afVaBDl(^fJtFzb1`IEG|6znyV=+hPTtw(b>Q@4PJZfBsj#WX(@z373s;&&GAX zU$sEx3CFhy9x6heE|1I?xqbM2dWFw(*UC8>tE0?y1*l&@9*_pb*A*bvmBB6!{Q9cyv@8hQD*;l&7n^~XgM{)=Dc6SrYnlel#lL|&?NX!~k@eyC7(YA(-V z)d{JW+}`Dt^v%>>ZO~BtuBeZx!g*Wvn~Iu%=NpRdth~W?t5o93TYA}J z>3iEPE6irscZkpan>h2FDU-;bBkw2Olb^P-+%3Fd^TD_!b(gLA-pR8y1=Z`- zJ=(b>dCI?i?`v-@U#ER!yH4GgqxqHb53QQ!ce*G|^iZi2Y(HFo+}FVdQ&MBb@0F4jy+W-In literal 0 HcmV?d00001 From 38dd083cdcd6e4b0a41d11098b6d379f775fec49 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 1 Oct 2025 09:48:44 +0800 Subject: [PATCH 094/101] =?UTF-8?q?add:=E8=80=81=E7=89=88UI=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 9 +++++ Ink Canvas/MainWindow.xaml.cs | 5 +-- Ink Canvas/MainWindow_cs/MW_Icons.cs | 31 +++++++++++++++ Ink Canvas/MainWindow_cs/MW_Settings.cs | 38 +++++++++++++++++++ Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs | 4 ++ Ink Canvas/Resources/Settings.cs | 2 + 6 files changed, 85 insertions(+), 4 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 68132647..cfd69d79 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -1206,6 +1206,15 @@ + + + + + + diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index b1ebfc3f..a18bbb96 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -552,10 +552,7 @@ namespace Ink_Canvas ApplyNoFocusMode(); ToggleSwitchAlwaysOnTop.IsOn = Settings.Advanced.IsAlwaysOnTop; ApplyAlwaysOnTop(); - - // 初始化UIElement选择系统 - - + // 初始化剪贴板监控 InitializeClipboardMonitoring(); diff --git a/Ink Canvas/MainWindow_cs/MW_Icons.cs b/Ink Canvas/MainWindow_cs/MW_Icons.cs index 72ccca77..b7454341 100644 --- a/Ink Canvas/MainWindow_cs/MW_Icons.cs +++ b/Ink Canvas/MainWindow_cs/MW_Icons.cs @@ -37,5 +37,36 @@ public static string EnabledGestureIconBadgeCheck = "M22.74,18.2234C22.74,20.8888 20.5793,23.0494 17.914,23.0494 15.2487,23.0494 13.088,20.8888 13.088,18.2234 13.088,15.5581 15.2487,13.3975 17.914,13.3975 20.5793,13.3975 22.74,15.5581 22.74,18.2234z M21.1673,15.8009C21.4651,16.0889,21.473,16.5637,21.1851,16.8614L17.5425,20.6282C17.4012,20.7743 17.2066,20.8568 17.0034,20.8568 16.8001,20.8568 16.6055,20.7743 16.4642,20.6282L14.6429,18.7448C14.355,18.447 14.3629,17.9722 14.6607,17.6843 14.9585,17.3963 15.4333,17.4043 15.7212,17.7021L17.0034,19.0279 20.1068,15.8187C20.3947,15.5209,20.8695,15.513,21.1673,15.8009z"; + + // 老版浮动栏按钮图标 + public static string LegacyLinedCursorIcon = + "F0 M24,24z M0,0z M3.85151,2.7073C3.52422,2.57095 3.147,2.64558 2.89629,2.89629 2.64558,3.147 2.57095,3.52422 2.7073,3.85151L9.7773,20.8215C9.91729,21.1575 10.2507,21.3718 10.6145,21.3595 10.9783,21.3473 11.2965,21.1111 11.4135,20.7664L13.4711,14.7085 18.8963,20.1337C19.238,20.4754 19.792,20.4754 20.1337,20.1337 20.4754,19.792 20.4754,19.238 20.1337,18.8963L14.7085,13.4711 20.7664,11.4135C21.1111,11.2965 21.3473,10.9783 21.3595,10.6145 21.3718,10.2507 21.1575,9.91729 20.8215,9.7773L3.85151,2.7073z M10.5017,18.0097L5.13984,5.13984 18.0097,10.5017 12.8136,12.2665C12.5561,12.3539,12.3539,12.5561,12.2665,12.8136L10.5017,18.0097z"; + + public static string LegacySolidCursorIcon = + "F0 M24,24z M0,0z M2.89629,2.89629C3.147,2.64558,3.52422,2.57095,3.85151,2.7073L20.8215,9.7773C21.1575,9.91729 21.3718,10.2507 21.3595,10.6145 21.3473,10.9783 21.1111,11.2965 20.7664,11.4135L14.7085,13.4711 20.1337,18.8963C20.4754,19.238 20.4754,19.792 20.1337,20.1337 19.792,20.4754 19.238,20.4754 18.8963,20.1337L13.4711,14.7085 11.4135,20.7664C11.2965,21.1111 10.9783,21.3473 10.6145,21.3595 10.2507,21.3718 9.91729,21.1575 9.7773,20.8215L2.7073,3.85151C2.57095,3.52422,2.64558,3.147,2.89629,2.89629z"; + + public static string LegacyLinedPenIcon = + "F0 M24,24z M0,0z M18.7033,4.39761C18.4948,4.31644 18.2714,4.27922 18.0473,4.28846 17.8233,4.29771 17.6038,4.3532 17.403,4.4512 17.2022,4.54919 17.0246,4.68744 16.8813,4.8568 16.8665,4.87422 16.8511,4.89102 16.8349,4.90716L15.7108,6.03131 17.9591,8.27962 19.0832,7.15546C19.1021,7.13662 19.1218,7.11869 19.1424,7.10176 19.3143,6.96037 19.4543,6.7853 19.5537,6.58793 19.6531,6.39058 19.7099,6.1751 19.7207,5.95519 19.7314,5.73528 19.6959,5.51545 19.6163,5.30962 19.5367,5.10378 19.4147,4.91625 19.2576,4.75914 19.1004,4.60201 18.9117,4.47877 18.7033,4.39761z M16.7944,9.44428L14.5461,7.19597 5.47079,16.2713 4.62767,19.3627 7.7191,18.5196 16.7944,9.44428z M13.9636,5.44913L4.15148,15.2613C4.05014,15.3626,3.977,15.4886,3.93929,15.6269L2.65942,20.3198C2.58166,20.6049 2.66264,20.9098 2.87161,21.1188 3.08059,21.3277 3.38551,21.4087 3.67063,21.331L8.36347,20.0511C8.50174,20.0134,8.62777,19.9402,8.72911,19.8389L20.2217,8.34636C20.5551,8.06468 20.8283,7.71873 21.0247,7.3289 21.2275,6.92628 21.3437,6.48586 21.3658,6.03572 21.3878,5.58559 21.3151,5.13594 21.1525,4.71552 20.99,4.29512 20.7411,3.91338 20.4222,3.59447 20.1033,3.27558 19.7214,3.0265 19.3009,2.86277 18.8804,2.69905 18.4304,2.62417 17.9794,2.64278 17.5285,2.66139 17.0862,2.77308 16.6807,2.97095 16.2862,3.16344 15.9348,3.43348 15.6478,3.76494L13.9636,5.44913z"; + + public static string LegacySolidPenIcon = + "F1 M24,24z M0,0z M19.3332,2.85933C18.9193,2.69814 18.4762,2.62442 18.0322,2.64274 17.5882,2.66106 17.1527,2.77103 16.7535,2.96583 16.3643,3.15575 16.0177,3.42232 15.7349,3.74956L14.5672,4.91725 19.0731,9.4231 20.2373,8.25888C20.5666,7.98121 20.8364,7.63993 21.0302,7.25528 21.2298,6.85899 21.3442,6.42551 21.3659,5.98249 21.3876,5.53947 21.3161,5.09692 21.1561,4.68313 20.996,4.26934 20.7511,3.89359 20.4372,3.57966 20.1232,3.26574 19.7472,3.02052 19.3332,2.85933z M18.0085,10.4877L13.5026,5.98183 4.14128,15.3432C4.04864,15.4358,3.98179,15.551,3.94732,15.6774L2.65684,20.4091C2.58577,20.6698 2.65979,20.9485 2.8508,21.1395 3.04182,21.3305 3.32054,21.4045 3.58117,21.3335L8.3129,20.043C8.43929,20.0085,8.5545,19.9417,8.64713,19.849L18.0085,10.4877z"; + + public static string LegacyLinedEraserStrokeIcon = + "F0 M25,24z M0,0z M7.32029,21.36L13.0098,21.36 13.0122,21.36 21.5471,21.36C21.989,21.36 22.3473,21.0017 22.3473,20.5598 22.3473,20.1179 21.989,19.7596 21.5471,19.7596L14.9429,19.7596 21.4352,13.2673C22.7372,12.0786,22.6872,10.1353,21.449,8.89707L16.1515,3.59952C14.9628,2.29751,13.0195,2.34754,11.7813,3.58572L2.68992,12.6771C1.3879,13.8657,1.43793,15.8091,2.67611,17.0473L6.75447,21.1256C6.90453,21.2757,7.10807,21.36,7.32029,21.36z M14.9771,4.68685C14.4571,4.10907,13.5664,4.06392,12.9129,4.71737L6.55503,11.0753 13.9595,18.4797 20.3174,12.1218C20.3273,12.1119 20.3375,12.1022 20.3479,12.0929 20.9257,11.5729 20.9708,10.6822 20.3174,10.0287L15.006,4.71737C14.9961,4.70745,14.9864,4.69727,14.9771,4.68685z M12.8278,19.6114L5.42338,12.2069 3.80776,13.8225C3.79784,13.8324 3.78766,13.8421 3.77724,13.8515 3.19947,14.3715 3.15431,15.2622 3.80776,15.9156L7.65174,19.7596 12.6796,19.7596 12.8278,19.6114z"; + + public static string LegacySolidEraserStrokeIcon = + "F1 M24,24z M0,0z M11.6199,3.61372C12.8916,2.34202,14.8995,2.2837,16.1307,3.62964L21.3433,8.84225C22.615,10.1139,22.6733,12.1218,21.3274,13.353L15.1877,19.4927 5.46434,9.76928 11.6199,3.61372z M7.33167,21.36C7.08919,21.36 6.86831,21.2676 6.70232,21.116 6.69184,21.1064 6.68155,21.0966 6.67147,21.0865L2.65671,17.0718C1.385,15.8001,1.32668,13.7922,2.67262,12.561L4.14394,11.0897 12.5469,19.4927 21.3367,19.4927C21.8523,19.4927 22.2703,19.9107 22.2703,20.4263 22.2703,20.942 21.8523,21.36 21.3367,21.36L7.33167,21.36z"; + + public static string LegacyLinedEraserCircleIcon = + "F0 M25,24z M0,0z M2.47995,17.1206L6.56736,21.208C6.57733,21.218 6.58749,21.2277 6.59783,21.237 6.66429,21.2971 6.7405,21.3466 6.82381,21.3829L6.83712,21.3885C6.84698,21.3926 6.85693,21.3965 6.86698,21.4003 6.86818,21.4007 6.86937,21.4011 6.87057,21.4016 6.94576,21.4289 7.02412,21.4451 7.10303,21.45L7.12183,21.451 7.13076,21.4513 7.13345,21.4514 7.15549,21.4517 17.0847,21.4517C17.5973,22.3438 18.5597,22.9445 19.6624,22.9445 21.3031,22.9445 22.6332,21.6144 22.6332,19.9737 22.6332,18.3329 21.3031,17.0028 19.6624,17.0028 18.0839,17.0028 16.793,18.2338 16.6972,19.7882L14.8669,19.7882 21.3224,13.3327C22.6404,12.1289,22.5884,10.1619,21.3367,8.91021L16.0278,3.60138C14.8241,2.28336,12.8571,2.33535,11.6053,3.58706L2.49426,12.6981C1.17625,13.9019,1.22824,15.8689,2.47995,17.1206z M14.8072,4.7316C14.2984,4.16633,13.4255,4.11939,12.7816,4.76332L6.43063,11.1143 13.8094,18.4931 20.1604,12.1421C20.1707,12.1318 20.1813,12.1218 20.1921,12.112 20.7574,11.6033 20.8043,10.7304 20.1604,10.0865L14.8373,4.76332C14.8269,4.75301,14.8169,4.74243,14.8072,4.7316z M3.65621,13.8887C3.6459,13.899 3.63532,13.9091 3.62448,13.9188 3.05922,14.4276 3.01228,15.3004 3.65621,15.9444L7.50001,19.7882 12.752,19.7882 5.25437,12.2906 3.65621,13.8887z"; + + public static string LegacySolidEraserCircleIcon = + "F1 M24,24z M0,0z M15.0919,19.6686L21.4282,13.3322C22.7462,12.1285,22.6942,10.1616,21.4426,8.90993L16.134,3.60133C14.9303,2.28338,12.9633,2.33537,11.7117,3.58702L5.36097,9.93771 15.0919,19.6686z M6.67201,21.2053C6.82267,21.3569,7.03137,21.4508,7.26201,21.4508L17.1907,21.4508C17.7033,22.3429 18.6657,22.9437 19.7683,22.9437 21.409,22.9437 22.7391,21.6136 22.7391,19.9729 22.7391,18.3322 21.409,17.0022 19.7683,17.0022 18.19,17.0022 16.8991,18.2331 16.8033,19.7874L12.8583,19.7874 4.18476,11.1139 2.60098,12.6977C1.28303,13.9014,1.33502,15.8683,2.58667,17.12L6.67201,21.2053z"; + + public static string LegacyLinedLassoSelectIcon = + "F0 M24,24z M0,0z M14.4715,12.7092L14.4715,18.7882 15.8291,16.7546C15.9688,16.5453,16.2038,16.4196,16.4554,16.4196L19.0106,16.4196 14.4715,12.7092z M14.6618,10.9193C14.4981,10.784 14.2733,10.6788 14.0025,10.6788 13.9951,10.6788 13.9877,10.6789 13.9803,10.6791 13.7083,10.6872 13.4502,10.8008 13.2607,10.9961 13.0712,11.1913 12.9653,11.4526 12.9653,11.7246L12.9653,20.3314C12.9653,20.3403 12.9655,20.3491 12.9658,20.358 12.9734,20.5733 13.0468,20.7811 13.176,20.9534 13.3053,21.1258 13.4842,21.2544 13.6888,21.3219 13.765,21.3471 13.8447,21.36 13.925,21.36L14.0025,21.36C14.1661,21.36 14.3276,21.3218 14.474,21.2486 14.6204,21.1754 14.7477,21.0692 14.8459,20.9382 14.8542,20.9272 14.8622,20.9159 14.8698,20.9045L16.8582,17.9258 20.3145,17.9258C20.5287,17.9281 20.7384,17.8641 20.9149,17.7424 21.0941,17.6187 21.2299,17.4417 21.3029,17.2365 21.3759,17.0313 21.3825,16.8084 21.3217,16.5993 21.262,16.3936 21.14,16.2117 20.9729,16.0782L14.6618,10.9193z M8.14548,20.0044C7.70454,19.6737 7.34665,19.2448 7.10016,18.7519 6.94658,18.4447 6.83887,18.1179 6.7795,17.7818 7.131,17.6605 7.45404,17.4604 7.72196,17.1924 7.74959,17.1648 7.7765,17.1366 7.80267,17.1078 8.5567,17.4118 9.3392,17.6365 10.1444,17.7694 10.5548,17.8372 10.9424,17.5594 11.0101,17.149 11.0779,16.7387 10.8001,16.3511 10.3897,16.2833 9.72172,16.1731 9.06686,15.9883 8.42926,15.7362 8.44084,15.6393 8.44672,15.5413 8.44672,15.4427 8.44672,14.7865 8.18602,14.1571 7.72196,13.693 7.25791,13.229 6.62852,12.9682 5.97224,12.9682 5.65536,12.9682 5.34474,13.029 5.05598,13.1441 4.47073,12.3026 4.15196,11.303 4.14328,10.2756 4.14532,7.03688 7.49758,4.1462 11.9971,4.1462 16.4941,4.1462 19.8451,7.03371 19.8508,10.2703 19.8388,10.7807 19.7549,11.2869 19.6016,11.7739 19.4767,12.1706 19.697,12.5934 20.0938,12.7183 20.4905,12.8432 20.9134,12.6228 21.0383,12.2261 21.2351,11.6008 21.3424,10.9507 21.3568,10.2952L21.357,10.2786C21.357,5.91009 16.9982,2.64 11.9971,2.64 6.9959,2.64 2.63705,5.91009 2.63705,10.2786L2.6371,10.2845C2.6479,11.6579 3.08647,12.993 3.89074,14.1047 3.63615,14.5007 3.49777,14.9646 3.49777,15.4427 3.49777,16.099 3.75847,16.7284 4.22252,17.1924 4.51465,17.4846 4.87229,17.6961 5.26092,17.8128 5.33333,18.3726 5.49917,18.9179 5.75297,19.4255 6.10404,20.1276 6.61375,20.7383 7.24176,21.2093 7.5745,21.4589 8.04654,21.3915 8.2961,21.0587 8.54566,20.726 8.47822,20.2539 8.14548,20.0044z M5.97224,14.4745C5.71544,14.4745 5.46916,14.5765 5.28757,14.7581 5.10598,14.9396 5.00397,15.1859 5.00397,15.4427 5.00397,15.6995 5.10598,15.9458 5.28757,16.1274 5.46916,16.309 5.71544,16.411 5.97224,16.411 6.22904,16.411 6.47533,16.309 6.65692,16.1274 6.8385,15.9458 6.94052,15.6995 6.94052,15.4427 6.94052,15.1859 6.8385,14.9396 6.65692,14.7581 6.47533,14.5765 6.22904,14.4745 5.97224,14.4745z"; + + public static string LegacySolidLassoSelectIcon = + "F1 M24,24z M0,0z M14.6618,10.9193C14.4981,10.784 14.2733,10.6788 14.0025,10.6788 13.9951,10.6788 13.9877,10.6789 13.9803,10.6791 13.7083,10.6872 13.4502,10.8008 13.2607,10.9961 13.0712,11.1913 12.9653,11.4526 12.9653,11.7246L12.9653,20.3314C12.9653,20.3403 12.9655,20.3491 12.9658,20.358 12.9734,20.5733 13.0468,20.7811 13.176,20.9534 13.3053,21.1258 13.4842,21.2544 13.6888,21.3219 13.765,21.3471 13.8447,21.36 13.925,21.36L14.0025,21.36C14.1661,21.36 14.3276,21.3218 14.474,21.2486 14.6204,21.1754 14.7477,21.0692 14.8459,20.9382 14.8542,20.9272 14.8622,20.9159 14.8698,20.9045L16.8582,17.9258 20.3145,17.9258C20.5287,17.9281 20.7384,17.8641 20.9149,17.7424 21.0941,17.6187 21.2299,17.4417 21.3029,17.2365 21.3759,17.0313 21.3825,16.8084 21.3217,16.5993 21.262,16.3936 21.14,16.2117 20.9729,16.0782L14.6618,10.9193z M8.14548,20.0044C7.70454,19.6737 7.34665,19.2448 7.10016,18.7519 6.94658,18.4447 6.83888,18.1179 6.7795,17.7818 7.131,17.6605 7.45404,17.4604 7.72196,17.1924 7.74959,17.1648 7.77649,17.1366 7.80267,17.1078 8.5567,17.4118 9.3392,17.6365 10.1444,17.7694 10.5548,17.8372 10.9424,17.5594 11.0101,17.149 11.0779,16.7387 10.8001,16.3511 10.3897,16.2833 9.72172,16.1731 9.06686,15.9883 8.42926,15.7362 8.44084,15.6393 8.44672,15.5413 8.44672,15.4427 8.44672,14.7865 8.18602,14.1571 7.72196,13.693 7.25791,13.229 6.62852,12.9682 5.97224,12.9682 5.65536,12.9682 5.34474,13.029 5.05598,13.1441 4.47073,12.3026 4.15196,11.303 4.14328,10.2756 4.14532,7.03688 7.49758,4.1462 11.9971,4.1462 16.4941,4.1462 19.8451,7.03371 19.8508,10.2703 19.8388,10.7807 19.7549,11.2869 19.6016,11.7739 19.4767,12.1706 19.697,12.5934 20.0938,12.7183 20.4905,12.8432 20.9134,12.6228 21.0383,12.2261 21.2351,11.6008 21.3424,10.9507 21.3568,10.2952L21.357,10.2786C21.357,5.91009 16.9982,2.64 11.9971,2.64 6.9959,2.64 2.63705,5.91009 2.63705,10.2786L2.6371,10.2845C2.6479,11.6579 3.08647,12.993 3.89074,14.1047 3.63615,14.5007 3.49777,14.9646 3.49777,15.4427 3.49777,16.099 3.75847,16.7284 4.22252,17.1924 4.51465,17.4846 4.87229,17.6961 5.26092,17.8128 5.33333,18.3726 5.49917,18.9178 5.75297,19.4255 6.10404,20.1276 6.61375,20.7383 7.24176,21.2093 7.5745,21.4589 8.04654,21.3915 8.2961,21.0587 8.54566,20.726 8.47822,20.2539 8.14548,20.0044z"; } } \ No newline at end of file diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index 8160b4ea..03de3551 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -2592,10 +2592,48 @@ namespace Ink_Canvas SaveSettingsToFile(); } + public void UpdateFloatingBarIcons() + { + if (Settings.Appearance.UseLegacyFloatingBarUI) + { + // 使用老版图标 + CursorIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LegacyLinedCursorIcon); + PenIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LegacyLinedPenIcon); + StrokeEraserIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LegacyLinedEraserStrokeIcon); + CircleEraserIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LegacyLinedEraserCircleIcon); + LassoSelectIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LegacyLinedLassoSelectIcon); + } + else + { + // 使用新版图标 + CursorIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedCursorIcon); + PenIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedPenIcon); + StrokeEraserIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedEraserStrokeIcon); + CircleEraserIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedEraserCircleIcon); + LassoSelectIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedLassoSelectIcon); + } + } + #endregion #region 浮动栏按钮显示控制 + private void CheckBoxUseLegacyFloatingBarUI_Checked(object sender, RoutedEventArgs e) + { + if (!isLoaded) return; + Settings.Appearance.UseLegacyFloatingBarUI = CheckBoxUseLegacyFloatingBarUI.IsChecked ?? false; + UpdateFloatingBarIcons(); + SaveSettingsToFile(); + } + + private void CheckBoxUseLegacyFloatingBarUI_Unchecked(object sender, RoutedEventArgs e) + { + if (!isLoaded) return; + Settings.Appearance.UseLegacyFloatingBarUI = CheckBoxUseLegacyFloatingBarUI.IsChecked ?? false; + UpdateFloatingBarIcons(); + SaveSettingsToFile(); + } + private void CheckBoxShowShapeButton_Checked(object sender, RoutedEventArgs e) { if (!isLoaded) return; diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index 599b334a..861d5c55 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -397,6 +397,7 @@ namespace Ink_Canvas Settings.Appearance.EnableChickenSoupInWhiteboardMode; // 浮动栏按钮显示控制开关初始化 + CheckBoxUseLegacyFloatingBarUI.IsChecked = Settings.Appearance.UseLegacyFloatingBarUI; CheckBoxShowShapeButton.IsChecked = Settings.Appearance.IsShowShapeButton; CheckBoxShowUndoButton.IsChecked = Settings.Appearance.IsShowUndoButton; CheckBoxShowRedoButton.IsChecked = Settings.Appearance.IsShowRedoButton; @@ -414,6 +415,9 @@ namespace Ink_Canvas // 应用浮动栏按钮可见性设置 UpdateFloatingBarButtonsVisibility(); + + // 更新浮动栏图标 + UpdateFloatingBarIcons(); SystemEvents_UserPreferenceChanged(null, null); } diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs index 1929de1a..77f0103b 100644 --- a/Ink Canvas/Resources/Settings.cs +++ b/Ink Canvas/Resources/Settings.cs @@ -209,6 +209,8 @@ namespace Ink_Canvas public int Theme { get; set; } // 浮动栏按钮显示控制 + [JsonProperty("useLegacyFloatingBarUI")] + public bool UseLegacyFloatingBarUI { get; set; } = false; [JsonProperty("isShowShapeButton")] public bool IsShowShapeButton { get; set; } = true; [JsonProperty("isShowUndoButton")] From 688f742c167e5d776837ee97b8eb2b962e04e290 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 1 Oct 2025 09:52:15 +0800 Subject: [PATCH 095/101] =?UTF-8?q?add:=E8=80=81=E7=89=88UI=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MainWindow_cs/MW_FloatingBarIcons.cs | 20 +++++----- Ink Canvas/MainWindow_cs/MW_Icons.cs | 3 ++ Ink Canvas/MainWindow_cs/MW_Settings.cs | 39 +++++++++++++++++++ 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 43e13d0c..6057b22f 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -429,17 +429,17 @@ namespace Ink_Canvas if (mode != "clear") { CursorIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); - CursorIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedCursorIcon); + CursorIconGeometry.Geometry = Geometry.Parse(GetCorrectIcon("cursor", false)); PenIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); - PenIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedPenIcon); + PenIconGeometry.Geometry = Geometry.Parse(GetCorrectIcon("pen", false)); StrokeEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); StrokeEraserIconGeometry.Geometry = - Geometry.Parse(XamlGraphicsIconGeometries.LinedEraserStrokeIcon); + Geometry.Parse(GetCorrectIcon("eraserStroke", false)); CircleEraserIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); CircleEraserIconGeometry.Geometry = - Geometry.Parse(XamlGraphicsIconGeometries.LinedEraserCircleIcon); + Geometry.Parse(GetCorrectIcon("eraserCircle", false)); LassoSelectIconGeometry.Brush = new SolidColorBrush(FloatBarForegroundColor); - LassoSelectIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.LinedLassoSelectIcon); + LassoSelectIconGeometry.Geometry = Geometry.Parse(GetCorrectIcon("lassoSelect", false)); // 根据主题设置颜色 if (Settings.Appearance.Theme == 1) // 深色主题 @@ -482,7 +482,7 @@ namespace Ink_Canvas case "color": { PenIconGeometry.Brush = new SolidColorBrush(Color.FromRgb(30, 58, 138)); - PenIconGeometry.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.SolidPenIcon); + PenIconGeometry.Geometry = Geometry.Parse(GetCorrectIcon("pen", true)); BoardPen.Background = new SolidColorBrush(Color.FromRgb(37, 99, 235)); BoardPen.BorderBrush = new SolidColorBrush(Color.FromRgb(37, 99, 235)); BoardPenGeometry.Brush = new SolidColorBrush(Colors.GhostWhite); @@ -495,7 +495,7 @@ namespace Ink_Canvas { CircleEraserIconGeometry.Brush = new SolidColorBrush(Color.FromRgb(30, 58, 138)); CircleEraserIconGeometry.Geometry = - Geometry.Parse(XamlGraphicsIconGeometries.SolidEraserCircleIcon); + Geometry.Parse(GetCorrectIcon("eraserCircle", true)); BoardEraser.Background = new SolidColorBrush(Color.FromRgb(37, 99, 235)); BoardEraser.BorderBrush = new SolidColorBrush(Color.FromRgb(37, 99, 235)); BoardEraserGeometry.Brush = new SolidColorBrush(Colors.GhostWhite); @@ -508,7 +508,7 @@ namespace Ink_Canvas { StrokeEraserIconGeometry.Brush = new SolidColorBrush(Color.FromRgb(30, 58, 138)); StrokeEraserIconGeometry.Geometry = - Geometry.Parse(XamlGraphicsIconGeometries.SolidEraserStrokeIcon); + Geometry.Parse(GetCorrectIcon("eraserStroke", true)); BoardEraser.Background = new SolidColorBrush(Color.FromRgb(37, 99, 235)); BoardEraser.BorderBrush = new SolidColorBrush(Color.FromRgb(37, 99, 235)); BoardEraserGeometry.Brush = new SolidColorBrush(Colors.GhostWhite); @@ -521,7 +521,7 @@ namespace Ink_Canvas { LassoSelectIconGeometry.Brush = new SolidColorBrush(Color.FromRgb(30, 58, 138)); LassoSelectIconGeometry.Geometry = - Geometry.Parse(XamlGraphicsIconGeometries.SolidLassoSelectIcon); + Geometry.Parse(GetCorrectIcon("lassoSelect", true)); BoardSelect.Background = new SolidColorBrush(Color.FromRgb(37, 99, 235)); BoardSelect.BorderBrush = new SolidColorBrush(Color.FromRgb(37, 99, 235)); BoardSelectGeometry.Brush = new SolidColorBrush(Colors.GhostWhite); @@ -534,7 +534,7 @@ namespace Ink_Canvas { CursorIconGeometry.Brush = new SolidColorBrush(Color.FromRgb(30, 58, 138)); CursorIconGeometry.Geometry = - Geometry.Parse(XamlGraphicsIconGeometries.LinedCursorIcon); + Geometry.Parse(GetCorrectIcon("cursor", true)); // 根据主题设置颜色 if (Settings.Appearance.Theme == 1) // 深色主题 { diff --git a/Ink Canvas/MainWindow_cs/MW_Icons.cs b/Ink Canvas/MainWindow_cs/MW_Icons.cs index b7454341..0619efe3 100644 --- a/Ink Canvas/MainWindow_cs/MW_Icons.cs +++ b/Ink Canvas/MainWindow_cs/MW_Icons.cs @@ -5,6 +5,9 @@ public static string LinedCursorIcon = "F1 M24,24z M0,0z M5.72106,15.9716L3.71327,3.00395C3.6389,2.6693 3.65747,2.41831 3.76902,2.25099 3.88057,2.08366 4.0479,2 4.271,2 4.4941,2 4.71711,2.07437 4.94021,2.2231 6.72502,3.39438 9.28149,5.10481 12.6094,7.3544 15.677,9.45526 18.1125,11.1285 19.9159,12.3742 20.1204,12.5229 20.2505,12.6995 20.3062,12.904 20.362,13.1085 20.3249,13.2944 20.1947,13.4618 20.0832,13.6105 19.8973,13.6849 19.637,13.6849L13.3902,13.6849 17.6291,19.7365C17.722,19.8666 17.75,20.0153 17.7128,20.1827 17.6942,20.3314 17.6198,20.4522 17.4897,20.5452L15.5654,21.8838C15.4353,21.9768 15.2865,22.0139 15.1192,21.9953 14.9704,21.9582 14.8496,21.8745 14.7566,21.7444L10.2389,15.2745 7.58956,19.9038C7.45942,20.1269 7.30144,20.2756 7.11552,20.35 6.92961,20.4058 6.75292,20.3872 6.5856,20.2942 6.43686,20.2013 6.34392,20.0339 6.30673,19.7922L6.00007,17.8959C5.88852,17.0779,5.79543,16.4364,5.72106,15.9716z"; + public static string SolidCursorIcon = + "F1 M24,24z M0,0z M5.72106,15.9716L3.71327,3.00395C3.6389,2.6693 3.65747,2.41831 3.76902,2.25099 3.88057,2.08366 4.0479,2 4.271,2 4.4941,2 4.71711,2.07437 4.94021,2.2231 6.72502,3.39438 9.28149,5.10481 12.6094,7.3544 15.677,9.45526 18.1125,11.1285 19.9159,12.3742 20.1204,12.5229 20.2505,12.6995 20.3062,12.904 20.362,13.1085 20.3249,13.2944 20.1947,13.4618 20.0832,13.6105 19.8973,13.6849 19.637,13.6849L13.3902,13.6849 17.6291,19.7365C17.722,19.8666 17.75,20.0153 17.7128,20.1827 17.6942,20.3314 17.6198,20.4522 17.4897,20.5452L15.5654,21.8838C15.4353,21.9768 15.2865,22.0139 15.1192,21.9953 14.9704,21.9582 14.8496,21.8745 14.7566,21.7444L10.2389,15.2745 7.58956,19.9038C7.45942,20.1269 7.30144,20.2756 7.11552,20.35 6.92961,20.4058 6.75292,20.3872 6.5856,20.2942 6.43686,20.2013 6.34392,20.0339 6.30673,19.7922L6.00007,17.8959C5.88852,17.0779,5.79543,16.4364,5.72106,15.9716z"; + public static string LinedPenIcon = "F1 M24,24z M0,0z M16.996,2.34419L21.6823,7.00397C21.8941,7.23343 22,7.49819 22,7.79825 22,8.09831 21.8941,8.35425 21.6823,8.56606L10.8271,19.4212 4.57877,13.1994 15.4339,2.34419C15.6457,2.11473 15.9017,2 16.2018,2 16.5195,2 16.7842,2.11473 16.996,2.34419z M9.63571,20.5862L9.50333,20.6391 2.6725,21.9894C2.47834,22.0247 2.31066,21.9718 2.16946,21.8306 2.02825,21.707 1.97529,21.5481 2.01059,21.354L3.38736,14.5232C3.38736,14.4879,3.40502,14.4349,3.44032,14.3643L9.63571,20.5862z"; diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index 03de3551..f400141b 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -2614,6 +2614,45 @@ namespace Ink_Canvas } } + public string GetCorrectIcon(string iconType, bool isSolid = false) + { + if (Settings.Appearance.UseLegacyFloatingBarUI) + { + // 使用老版图标 + switch (iconType) + { + case "cursor": + return isSolid ? XamlGraphicsIconGeometries.LegacySolidCursorIcon : XamlGraphicsIconGeometries.LegacyLinedCursorIcon; + case "pen": + return isSolid ? XamlGraphicsIconGeometries.LegacySolidPenIcon : XamlGraphicsIconGeometries.LegacyLinedPenIcon; + case "eraserStroke": + return isSolid ? XamlGraphicsIconGeometries.LegacySolidEraserStrokeIcon : XamlGraphicsIconGeometries.LegacyLinedEraserStrokeIcon; + case "eraserCircle": + return isSolid ? XamlGraphicsIconGeometries.LegacySolidEraserCircleIcon : XamlGraphicsIconGeometries.LegacyLinedEraserCircleIcon; + case "lassoSelect": + return isSolid ? XamlGraphicsIconGeometries.LegacySolidLassoSelectIcon : XamlGraphicsIconGeometries.LegacyLinedLassoSelectIcon; + } + } + else + { + // 使用新版图标 + switch (iconType) + { + case "cursor": + return isSolid ? XamlGraphicsIconGeometries.SolidCursorIcon : XamlGraphicsIconGeometries.LinedCursorIcon; + case "pen": + return isSolid ? XamlGraphicsIconGeometries.SolidPenIcon : XamlGraphicsIconGeometries.LinedPenIcon; + case "eraserStroke": + return isSolid ? XamlGraphicsIconGeometries.SolidEraserStrokeIcon : XamlGraphicsIconGeometries.LinedEraserStrokeIcon; + case "eraserCircle": + return isSolid ? XamlGraphicsIconGeometries.SolidEraserCircleIcon : XamlGraphicsIconGeometries.LinedEraserCircleIcon; + case "lassoSelect": + return isSolid ? XamlGraphicsIconGeometries.SolidLassoSelectIcon : XamlGraphicsIconGeometries.LinedLassoSelectIcon; + } + } + return ""; + } + #endregion #region 浮动栏按钮显示控制 From 9caef310dff6d675e9b97831dee1175417ec034d Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 1 Oct 2025 10:04:40 +0800 Subject: [PATCH 096/101] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index cfd69d79..e9495e55 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -1206,7 +1206,7 @@ - + From 0d7a478e16bae3a7751ba8db148e704e30f65f13 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 1 Oct 2025 11:29:59 +0800 Subject: [PATCH 097/101] =?UTF-8?q?improve:=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=8D=9F=E5=9D=8F=E8=87=AA=E5=8A=A8=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index 861d5c55..596d5bb7 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -70,7 +70,7 @@ namespace Ink_Canvas catch (Exception restoreEx) { LogHelper.WriteLogToFile($"从备份恢复后重新加载失败: {restoreEx.Message}", LogHelper.LogType.Error); - Settings = null; + BtnResetToSuggestion_Click(null, null); } } @@ -98,7 +98,7 @@ namespace Ink_Canvas catch (Exception restoreEx) { LogHelper.WriteLogToFile($"从备份恢复后加载失败: {restoreEx.Message}", LogHelper.LogType.Error); - Settings = null; + BtnResetToSuggestion_Click(null, null); } } From 66164a0c3385c25d54a45594e78825be0d0e7e97 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 1 Oct 2025 11:34:37 +0800 Subject: [PATCH 098/101] =?UTF-8?q?improve:=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=8D=9F=E5=9D=8F=E8=87=AA=E5=8A=A8=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index 596d5bb7..f5d4f5cb 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -101,6 +101,12 @@ namespace Ink_Canvas BtnResetToSuggestion_Click(null, null); } } + else + { + // 备份恢复失败(备份目录不存在等),使用默认设置 + LogHelper.WriteLogToFile("备份恢复失败,使用默认设置", LogHelper.LogType.Warning); + BtnResetToSuggestion_Click(null, null); + } // 如果仍然失败,使用默认设置 if (Settings == null) From 3a7417f493928208c84d76d35f92afb26a53e08e Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 1 Oct 2025 12:57:16 +0800 Subject: [PATCH 099/101] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/DeviceIdentifier.cs | 1 - Ink Canvas/MainWindow_cs/MW_AutoFold.cs | 1 - Ink Canvas/MainWindow_cs/MW_BoardIcons.cs | 1 - Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs | 8 -------- Ink Canvas/MainWindow_cs/MW_Settings.cs | 1 - 5 files changed, 12 deletions(-) diff --git a/Ink Canvas/Helpers/DeviceIdentifier.cs b/Ink Canvas/Helpers/DeviceIdentifier.cs index 0fc47e56..4929c50c 100644 --- a/Ink Canvas/Helpers/DeviceIdentifier.cs +++ b/Ink Canvas/Helpers/DeviceIdentifier.cs @@ -1065,7 +1065,6 @@ namespace Ink_Canvas.Helpers // 如果不是自动更新(即版本修复),则应用不同的策略 if (!isAutoUpdate) { - // 版本修复:立即允许,不受分级策略影响 LogHelper.WriteLogToFile($"DeviceIdentifier | 版本修复 - 版本: {updateVersion}, 类型: {updateType}, 结果: 允许"); return true; } diff --git a/Ink Canvas/MainWindow_cs/MW_AutoFold.cs b/Ink Canvas/MainWindow_cs/MW_AutoFold.cs index c77c56c3..6c4187c3 100644 --- a/Ink Canvas/MainWindow_cs/MW_AutoFold.cs +++ b/Ink Canvas/MainWindow_cs/MW_AutoFold.cs @@ -305,7 +305,6 @@ namespace Ink_Canvas SidePannelMarginAnimation(-50, !unfoldFloatingBarByUser); }); - // 修复:在浮动栏展开后,重新设置按钮高亮状态 await Dispatcher.InvokeAsync(async () => { try diff --git a/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs b/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs index ab4a399e..329c8733 100644 --- a/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_BoardIcons.cs @@ -726,7 +726,6 @@ namespace Ink_Canvas SetCurrentToolMode(InkCanvasEditingMode.EraseByStroke); drawingShapeMode = 0; - // 修复:切换到线擦时,确保重置笔的状态 penType = 0; drawingAttributes.IsHighlighter = false; drawingAttributes.StylusTip = StylusTip.Ellipse; diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 6057b22f..060994ab 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -1875,8 +1875,6 @@ namespace Ink_Canvas // 更新模式缓存,确保后续的模式检测正确 UpdateCurrentToolMode("cursor"); - // 修复:在浮动栏收起状态下,仍然需要设置按钮高亮状态 - // 这样在浮动栏展开时能正确显示高光 SetFloatingBarHighlightPosition("cursor"); // 切换前自动截图保存墨迹 @@ -2072,8 +2070,6 @@ namespace Ink_Canvas } } - // 修复:从线擦切换到批注时,保持之前的笔类型状态 - // 如果之前是荧光笔模式,则保持荧光笔状态;否则重置为默认笔模式 forceEraser = false; forcePointEraser = false; drawingShapeMode = 0; @@ -2101,7 +2097,6 @@ namespace Ink_Canvas { if (wasInInkMode) { - // 修复:从线擦切换到批注时,确保正确重置状态 if (forceEraser) { // 从橡皮擦模式切换过来,保持之前的笔类型状态 @@ -2179,7 +2174,6 @@ namespace Ink_Canvas // 更新模式缓存 UpdateCurrentToolMode("pen"); - // 修复:从线擦切换到批注时,保持之前的笔类型状态 forceEraser = false; forcePointEraser = false; drawingShapeMode = 0; @@ -2206,7 +2200,6 @@ namespace Ink_Canvas } - // 修复:从线擦切换到批注时,保持之前的笔类型状态 forceEraser = false; forcePointEraser = false; drawingShapeMode = 0; @@ -2333,7 +2326,6 @@ namespace Ink_Canvas drawingShapeMode = 0; - // 修复:切换到线擦时,保存当前的笔类型状态,而不是强制重置 // 这样从线擦切换回批注时,可以恢复之前的荧光笔状态 // penType 和 drawingAttributes 的状态将在 PenIcon_Click 中根据 wasHighlighter 来恢复 diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index f400141b..48b22800 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -2961,7 +2961,6 @@ namespace Ink_Canvas } // 重新计算浮动栏位置,因为按钮可见性变化会影响浮动栏宽度 - // 修复:移除浮动栏收起状态检查,确保在收起状态下也能正确修正位置 if (currentMode == 0) // 只在屏幕模式下重新计算浮动栏位置 { if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible) From 6f8e08c21a6e7b8266b5983857c8df794bf2ee7e Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 1 Oct 2025 13:03:11 +0800 Subject: [PATCH 100/101] fix:issue #217 --- Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs | 10 +-- Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 91 ++++++++++++++++++--- 2 files changed, 83 insertions(+), 18 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs index b2840d8a..752cbeff 100644 --- a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs +++ b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs @@ -175,7 +175,6 @@ namespace Ink_Canvas lastIsInMultiTouchMode = true; } - // 修复:几何绘制模式下确保不切换到Ink模式,避免触摸轨迹被收集 if (drawingShapeMode != 0) { inkCanvas.EditingMode = InkCanvasEditingMode.None; @@ -490,16 +489,16 @@ namespace Ink_Canvas SetCursorBasedOnEditingMode(inkCanvas); } - // 修复:几何绘制模式下完全禁止触摸轨迹收集 if (drawingShapeMode != 0) { // 确保几何绘制模式下不切换到Ink模式,避免触摸轨迹被收集 inkCanvas.EditingMode = InkCanvasEditingMode.None; + if (!isTouchDown) return; + if (isWaitUntilNextTouchDown && dec.Count > 1) return; if (dec.Count > 1) { - // 修复:双曲线绘制时,多指触摸不应该删除第一笔的辅助线 if ((drawingShapeMode == 24 || drawingShapeMode == 25) && drawMultiStepShapeCurrentStep == 1) { // 第二笔绘制双曲线时,只删除第二笔的临时笔画,保留第一笔的辅助线 @@ -524,7 +523,6 @@ namespace Ink_Canvas return; } - // 修复:双曲线绘制时,第二笔应该基于第一笔的起点,而不是触摸实时位置 Point touchPoint = e.GetTouchPoint(inkCanvas).Position; if ((drawingShapeMode == 24 || drawingShapeMode == 25) && drawMultiStepShapeCurrentStep == 1) { @@ -1004,7 +1002,6 @@ namespace Ink_Canvas drawMultiStepShapeSpecialParameter3 = k; drawMultiStepShapeSpecialStrokeCollection = strokes; - // 修复:第一笔绘制的辅助线应该立即显示在画布上 try { inkCanvas.Strokes.Remove(lastTempStrokeCollection); @@ -1097,7 +1094,6 @@ namespace Ink_Canvas } } - // 修复:双曲线绘制完成后,需要将第一笔的辅助线和第二笔的双曲线合并 try { // 删除第二笔的临时笔画 @@ -1759,6 +1755,7 @@ namespace Ink_Canvas } private bool isMouseDown; + private bool isTouchDown; private void inkCanvas_MouseDown(object sender, MouseButtonEventArgs e) { @@ -2024,7 +2021,6 @@ namespace Ink_Canvas private bool NeedUpdateIniP() { - // 修复:双曲线绘制时,第二笔不应该更新起点,保持第一笔的起点 if (drawingShapeMode == 24 || drawingShapeMode == 25) { if (drawMultiStepShapeCurrentStep == 1) diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index cd33bcff..e5af3efe 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -24,7 +24,6 @@ namespace Ink_Canvas private InkCanvasEditingMode lastInkCanvasEditingMode = InkCanvasEditingMode.Ink; private DateTime lastTouchDownTime = DateTime.MinValue; private const double MULTI_TOUCH_DELAY_MS = 100; - private bool isInWritingMode = false; private bool isMultiTouchTimerActive = false; /// @@ -244,11 +243,18 @@ namespace Ink_Canvas HideSubPanels(); // 书写时自动隐藏二级菜单 } - // 修复:几何绘制模式下完全禁止触摸轨迹收集 if (drawingShapeMode != 0) { // 确保几何绘制模式下不切换到Ink模式,避免触摸轨迹被收集 inkCanvas.EditingMode = InkCanvasEditingMode.None; + + isTouchDown = true; + ViewboxFloatingBar.IsHitTestVisible = false; + BlackboardUIGridForInkReplay.IsHitTestVisible = false; + + // 设置起始点 + if (NeedUpdateIniP()) iniP = e.GetTouchPoint(inkCanvas).Position; + return; } @@ -287,6 +293,14 @@ namespace Ink_Canvas if (drawingShapeMode != 0) { inkCanvas.EditingMode = InkCanvasEditingMode.None; + + isTouchDown = true; + ViewboxFloatingBar.IsHitTestVisible = false; + BlackboardUIGridForInkReplay.IsHitTestVisible = false; + + // 设置起始点 + if (NeedUpdateIniP()) iniP = e.GetPosition(inkCanvas); + return; } if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByStroke) @@ -335,6 +349,46 @@ namespace Ink_Canvas private async void MainWindow_StylusUp(object sender, StylusEventArgs e) { + if (drawingShapeMode != 0) + { + // 重置触摸状态 + isTouchDown = false; + ViewboxFloatingBar.IsHitTestVisible = true; + BlackboardUIGridForInkReplay.IsHitTestVisible = true; + + // 对于双曲线等需要多步绘制的图形,手写笔抬起时应该进入下一步 + if (drawingShapeMode == 24 || drawingShapeMode == 25) + { + if (drawMultiStepShapeCurrentStep == 0) + { + // 第一笔完成,进入第二笔 + drawMultiStepShapeCurrentStep = 1; + } + else + { + // 第二笔完成,完成绘制 + var mouseArgs = new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left) + { + RoutedEvent = MouseLeftButtonUpEvent, + Source = inkCanvas + }; + inkCanvas_MouseUp(inkCanvas, mouseArgs); + } + } + else + { + // 其他单步绘制的图形,手写笔抬起时完成绘制 + var mouseArgs = new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left) + { + RoutedEvent = MouseLeftButtonUpEvent, + Source = inkCanvas + }; + inkCanvas_MouseUp(inkCanvas, mouseArgs); + } + + return; + } + try { var stroke = GetStrokeVisual(e.StylusDevice.Id).Stroke; @@ -383,6 +437,16 @@ namespace Ink_Canvas { try { + if (drawingShapeMode != 0) + { + if (isTouchDown) + { + Point stylusPoint = e.GetPosition(inkCanvas); + MouseTouchMove(stylusPoint); + } + return; + } + if (GetTouchDownPointsList(e.StylusDevice.Id) != InkCanvasEditingMode.None) return; try { @@ -472,11 +536,19 @@ namespace Ink_Canvas dec.Add(e.TouchDevice.Id); return; } - // 修复:几何绘制模式下完全禁止触摸轨迹收集 if (drawingShapeMode != 0) { // 确保几何绘制模式下不切换到Ink模式,避免触摸轨迹被收集 inkCanvas.EditingMode = InkCanvasEditingMode.None; + + // 设置触摸状态,类似鼠标事件处理 + isTouchDown = true; + ViewboxFloatingBar.IsHitTestVisible = false; + BlackboardUIGridForInkReplay.IsHitTestVisible = false; + + // 设置起始点 + if (NeedUpdateIniP()) iniP = e.GetTouchPoint(inkCanvas).Position; + return; } if (inkCanvas.EditingMode == InkCanvasEditingMode.Ink) @@ -527,7 +599,6 @@ namespace Ink_Canvas { return; } - // 修复:几何绘制模式下完全禁止触摸轨迹收集 if (drawingShapeMode != 0) { // 确保几何绘制模式下不切换到Ink模式,避免触摸轨迹收集 @@ -538,7 +609,6 @@ namespace Ink_Canvas ViewboxFloatingBar.IsHitTestVisible = false; BlackboardUIGridForInkReplay.IsHitTestVisible = false; - // 修复:几何绘制模式下,只记录几何绘制的起点,不记录触摸轨迹 if (dec.Count == 0) { var inkTouchPoint = e.GetTouchPoint(inkCanvas); @@ -776,9 +846,12 @@ namespace Ink_Canvas LogHelper.WriteLogToFile("Palm eraser state reset completed"); } - // 修复:几何绘制模式下,触摸抬手时应该正确处理,而不是简单模拟鼠标事件 if (drawingShapeMode != 0) { + isTouchDown = false; + ViewboxFloatingBar.IsHitTestVisible = true; + BlackboardUIGridForInkReplay.IsHitTestVisible = true; + // 对于双曲线等需要多步绘制的图形,触摸抬手时应该进入下一步 if (drawingShapeMode == 24 || drawingShapeMode == 25) { @@ -836,8 +909,7 @@ namespace Ink_Canvas inkCanvas.EditingMode = lastInkCanvasEditingMode; } - // 修复:确保手掌擦除后触摸事件能正常响应 - if (isPalmEraserActive) + if (isPalmEraserActive) { LogHelper.WriteLogToFile("Palm eraser force recovery - all touch points cleared"); @@ -923,7 +995,6 @@ namespace Ink_Canvas // 三指及以上禁止缩放 bool disableScale = dec.Count >= 3; - // 修复:允许单指拖动选中的墨迹,即使禁用了多指手势 if (isInMultiTouchMode) return; if (dec.Count == 0 && (isSingleFingerDragMode || isInMultiTouchMode)) @@ -1138,7 +1209,6 @@ namespace Ink_Canvas inkCanvas.StylusUp -= MainWindow_StylusUp; inkCanvas.TouchDown -= MainWindow_TouchDown; inkCanvas.TouchDown += Main_Grid_TouchDown; - // 修复:几何绘制模式下不自动切换到Ink模式,避免触摸轨迹被收集 if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint && inkCanvas.EditingMode != InkCanvasEditingMode.EraseByStroke && drawingShapeMode == 0) @@ -1171,7 +1241,6 @@ namespace Ink_Canvas inkCanvas.StylusUp += MainWindow_StylusUp; inkCanvas.TouchDown += MainWindow_TouchDown; inkCanvas.TouchDown -= Main_Grid_TouchDown; - // 修复:几何绘制模式下不自动切换到Ink模式,避免触摸轨迹被收集 if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint && inkCanvas.EditingMode != InkCanvasEditingMode.EraseByStroke && drawingShapeMode == 0) From 6d98d96ccb5b9f3ba62e4d5b6343332505f27c08 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 1 Oct 2025 14:13:09 +0800 Subject: [PATCH 101/101] fix:issue #217 --- .../MainWindow_cs/MW_FloatingBarIcons.cs | 8 ++---- Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs | 27 ++++++++++--------- Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 6 ++--- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 060994ab..289e9039 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -1866,13 +1866,9 @@ namespace Ink_Canvas if (sender == Cursor_Icon && lastBorderMouseDownObject != Cursor_Icon) return; // 禁用高级橡皮擦系统 - DisableEraserOverlay(); - - // 使用集中化的工具模式切换方法,确保快捷键状态正确更新 - // 鼠标模式下应该禁用快捷键以放行键盘操作 + DisableEraserOverlay(); SetCurrentToolMode(InkCanvasEditingMode.None); - // 更新模式缓存,确保后续的模式检测正确 UpdateCurrentToolMode("cursor"); SetFloatingBarHighlightPosition("cursor"); @@ -2312,7 +2308,7 @@ namespace Ink_Canvas if (sender == EraserByStrokes_Icon && lastBorderMouseDownObject != EraserByStrokes_Icon) return; // 禁用高级橡皮擦系统 - DisableEraserOverlay(); + DisableEraserOverlay(); forceEraser = true; forcePointEraser = false; diff --git a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs index 752cbeff..85fe0501 100644 --- a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs +++ b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs @@ -491,25 +491,15 @@ namespace Ink_Canvas if (drawingShapeMode != 0) { - // 确保几何绘制模式下不切换到Ink模式,避免触摸轨迹被收集 inkCanvas.EditingMode = InkCanvasEditingMode.None; if (!isTouchDown) return; if (isWaitUntilNextTouchDown && dec.Count > 1) return; - if (dec.Count > 1) + + // 对于多笔图形绘制,允许第二笔绘制,即使dec.Count > 1 + if (dec.Count > 1 && !((drawingShapeMode == 24 || drawingShapeMode == 25) && drawMultiStepShapeCurrentStep == 1)) { - if ((drawingShapeMode == 24 || drawingShapeMode == 25) && drawMultiStepShapeCurrentStep == 1) - { - // 第二笔绘制双曲线时,只删除第二笔的临时笔画,保留第一笔的辅助线 - try - { - inkCanvas.Strokes.Remove(lastTempStroke); - } - catch { } - return; - } - // 其他情况正常删除临时笔画 try { @@ -522,6 +512,17 @@ namespace Ink_Canvas } return; } + + // 第二笔绘制双曲线时,只删除第二笔的临时笔画,保留第一笔的辅助线 + if ((drawingShapeMode == 24 || drawingShapeMode == 25) && drawMultiStepShapeCurrentStep == 1) + { + try + { + inkCanvas.Strokes.Remove(lastTempStroke); + } + catch { } + // 不直接返回,继续执行绘制逻辑 + } Point touchPoint = e.GetTouchPoint(inkCanvas).Position; if ((drawingShapeMode == 24 || drawingShapeMode == 25) && drawMultiStepShapeCurrentStep == 1) diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index e5af3efe..bd5b753d 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -245,7 +245,6 @@ namespace Ink_Canvas if (drawingShapeMode != 0) { - // 确保几何绘制模式下不切换到Ink模式,避免触摸轨迹被收集 inkCanvas.EditingMode = InkCanvasEditingMode.None; isTouchDown = true; @@ -538,7 +537,6 @@ namespace Ink_Canvas } if (drawingShapeMode != 0) { - // 确保几何绘制模式下不切换到Ink模式,避免触摸轨迹被收集 inkCanvas.EditingMode = InkCanvasEditingMode.None; // 设置触摸状态,类似鼠标事件处理 @@ -601,13 +599,13 @@ namespace Ink_Canvas } if (drawingShapeMode != 0) { - // 确保几何绘制模式下不切换到Ink模式,避免触摸轨迹收集 inkCanvas.EditingMode = InkCanvasEditingMode.None; - // 几何绘制模式下不记录触摸点,避免触摸轨迹被收集 SetCursorBasedOnEditingMode(inkCanvas); inkCanvas.CaptureTouch(e.TouchDevice); ViewboxFloatingBar.IsHitTestVisible = false; BlackboardUIGridForInkReplay.IsHitTestVisible = false; + + isTouchDown = true; if (dec.Count == 0) {

-aB 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 literal 7672 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 m-~8qeAK{3x*X-|r+5ZCv85`q8Au!MY0000HC From fcfba7a9786c6f27f16954650e4a9e9386c54566 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Mon, 22 Sep 2025 11:36:55 +0800 Subject: [PATCH 056/101] =?UTF-8?q?fix:=E8=BF=9B=E5=85=A5PPT=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=94=B6=E7=BA=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow_cs/MW_AutoFold.cs | 7 +-- .../MainWindow_cs/MW_FloatingBarIcons.cs | 7 +-- Ink Canvas/MainWindow_cs/MW_PPT.cs | 58 +++++++++++++++++-- Ink Canvas/MainWindow_cs/MW_Settings.cs | 11 ++++ 4 files changed, 71 insertions(+), 12 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_AutoFold.cs b/Ink Canvas/MainWindow_cs/MW_AutoFold.cs index a26e6b06..eae218b5 100644 --- a/Ink Canvas/MainWindow_cs/MW_AutoFold.cs +++ b/Ink Canvas/MainWindow_cs/MW_AutoFold.cs @@ -260,12 +260,11 @@ namespace Ink_Canvas } // 只有在PPT放映模式下且页数有效时才显示翻页按钮 - // 但是,如果启用了PPT自动收纳功能,则不显示翻页按钮 + // 翻页按钮的显示应该基于PPT放映状态,而不是自动收纳设置 if (StackPanelPPTControls.Visibility == Visibility.Visible && BtnPPTSlideShowEnd.Visibility == Visibility.Visible && PPTManager?.IsInSlideShow == true && - PPTManager?.SlidesCount > 0 && - !Settings.Automation.IsAutoFoldInPPTSlideShow) + PPTManager?.SlidesCount > 0) { var dops = Settings.PowerPointSettings.PPTButtonsDisplayOption.ToString(); var dopsc = dops.ToCharArray(); @@ -273,7 +272,7 @@ namespace Ink_Canvas if (dopsc[1] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightBottomPanelForPPTNavigation); if (dopsc[2] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(LeftSidePanelForPPTNavigation); if (dopsc[3] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightSidePanelForPPTNavigation); - LogHelper.WriteLogToFile($"从收纳模式恢复时显示PPT翻页按钮 - 放映状态: {PPTManager?.IsInSlideShow}, 页数: {PPTManager?.SlidesCount}", LogHelper.LogType.Trace); + LogHelper.WriteLogToFile($"从收纳模式恢复时显示PPT翻页按钮 - 放映状态: {PPTManager?.IsInSlideShow}, 页数: {PPTManager?.SlidesCount}, 自动收纳: {Settings.Automation.IsAutoFoldInPPTSlideShow}", LogHelper.LogType.Trace); } else { diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index c8eb0b5c..14069c2e 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -741,12 +741,11 @@ namespace Ink_Canvas HideSubPanelsImmediately(); // 只有在PPT放映模式下且页数有效时才显示翻页按钮 - // 但是,如果启用了PPT自动收纳功能,则不显示翻页按钮 + // 翻页按钮的显示应该基于PPT放映状态,而不是自动收纳设置 if (StackPanelPPTControls.Visibility == Visibility.Visible && BtnPPTSlideShowEnd.Visibility == Visibility.Visible && PPTManager?.IsInSlideShow == true && - PPTManager?.SlidesCount > 0 && - !Settings.Automation.IsAutoFoldInPPTSlideShow) + PPTManager?.SlidesCount > 0) { var dops = Settings.PowerPointSettings.PPTButtonsDisplayOption.ToString(); var dopsc = dops.ToCharArray(); @@ -754,7 +753,7 @@ namespace Ink_Canvas if (dopsc[1] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightBottomPanelForPPTNavigation); if (dopsc[2] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(LeftSidePanelForPPTNavigation); if (dopsc[3] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightSidePanelForPPTNavigation); - LogHelper.WriteLogToFile($"显示PPT翻页按钮 - 放映状态: {PPTManager?.IsInSlideShow}, 页数: {PPTManager?.SlidesCount}", LogHelper.LogType.Trace); + LogHelper.WriteLogToFile($"显示PPT翻页按钮 - 放映状态: {PPTManager?.IsInSlideShow}, 页数: {PPTManager?.SlidesCount}, 自动收纳: {Settings.Automation.IsAutoFoldInPPTSlideShow}", LogHelper.LogType.Trace); } else { diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 8d66fd6d..eb444b73 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -627,6 +627,11 @@ namespace Ink_Canvas if (!isFloatingBarFolded) FoldFloatingBar_MouseUp(new object(), null); } + else + { + // 如果关闭了自动收纳功能,重置状态记录,确保退出时不会错误收纳 + wasFloatingBarFoldedWhenEnterSlideShow = false; + } isStopInkReplay = true; @@ -776,14 +781,27 @@ namespace Ink_Canvas { try { - // 处理浮动栏状态:严格按进入前的状态恢复 - if (wasFloatingBarFoldedWhenEnterSlideShow) + // 处理浮动栏状态:根据自动收纳功能状态和进入前的状态恢复 + if (Settings.Automation.IsAutoFoldInPPTSlideShow) { - if (!isFloatingBarFolded) FoldFloatingBar_MouseUp(new object(), null); + // 只有在启用自动收纳功能时才根据记录的状态恢复 + if (wasFloatingBarFoldedWhenEnterSlideShow) + { + if (!isFloatingBarFolded) FoldFloatingBar_MouseUp(new object(), null); + } + else + { + if (isFloatingBarFolded) await UnFoldFloatingBar(new object()); + } } else { - if (isFloatingBarFolded) await UnFoldFloatingBar(new object()); + // 如果关闭了自动收纳功能,确保浮动栏展开 + if (isFloatingBarFolded) + { + await UnFoldFloatingBar(new object()); + LogHelper.WriteLogToFile("PPT自动收纳功能已关闭,强制展开浮动栏", LogHelper.LogType.Trace); + } } if (isEnteredSlideShowEndEvent) return; @@ -1068,6 +1086,38 @@ namespace Ink_Canvas } } + ///