From eb0cf272187f246b87046290c26d6e3c441eaa68 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Wed, 23 Jul 2025 19:42:41 +0800 Subject: [PATCH] =?UTF-8?q?improve:=E6=89=8B=E6=8E=8C=E6=93=A6?= 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 | 54 ++++++++++++++++++--------- Ink Canvas/MainWindow_cs/MW_Eraser.cs | 28 +++++++++++--- Ink Canvas/Resources/Settings.cs | 2 + 4 files changed, 69 insertions(+), 24 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 7df138b9..7882364b 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -851,6 +851,15 @@ + + + + + + diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index eae06189..bf93374e 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -265,10 +265,25 @@ namespace Ink_Canvas { catch { } } + // 新增:记录上一个模式 + private InkCanvasEditingMode lastEditingMode = InkCanvasEditingMode.Ink; + private void inkCanvas_EditingModeChanged(object sender, RoutedEventArgs e) { var inkCanvas1 = sender as InkCanvas; if (inkCanvas1 == null) return; + // 只负责显示/隐藏覆盖层,不再强制切换模式 + var eraserOverlay = this.FindName("AdvancedEraserOverlay") as Border; + if (eraserOverlay != null) { + if (inkCanvas1.EditingMode == InkCanvasEditingMode.EraseByPoint) { + eraserOverlay.IsHitTestVisible = true; + Trace.WriteLine("Advanced Eraser: Overlay enabled in eraser mode"); + } else { + eraserOverlay.IsHitTestVisible = false; + DisableAdvancedEraserSystem(); + Trace.WriteLine("Advanced Eraser: Overlay disabled in non-eraser mode"); + } + } // 使用辅助方法设置光标 SetCursorBasedOnEditingMode(inkCanvas1); if (Settings.Canvas.IsShowCursor) { @@ -279,31 +294,13 @@ namespace Ink_Canvas { else inkCanvas1.ForceCursor = false; } else { - // 套索选择模式下始终强制显示光标,即使用户设置不显示光标 if (inkCanvas1.EditingMode == InkCanvasEditingMode.Select) { inkCanvas1.ForceCursor = true; } else { inkCanvas1.ForceCursor = false; } } - if (inkCanvas1.EditingMode == InkCanvasEditingMode.Ink) forcePointEraser = !forcePointEraser; - - // 处理高级橡皮擦覆盖层的启用/禁用 - var eraserOverlay = this.FindName("AdvancedEraserOverlay") as Border; - if (eraserOverlay != null) { - if (inkCanvas1.EditingMode == InkCanvasEditingMode.EraseByPoint) { - // 橡皮擦模式下启用覆盖层 - eraserOverlay.IsHitTestVisible = true; - Trace.WriteLine("Advanced Eraser: Overlay enabled in eraser mode"); - } else { - // 其他模式下禁用覆盖层 - eraserOverlay.IsHitTestVisible = false; - // 同时禁用高级橡皮擦系统 - DisableAdvancedEraserSystem(); - Trace.WriteLine("Advanced Eraser: Overlay disabled in non-eraser mode"); - } - } } #endregion Ink Canvas @@ -314,11 +311,16 @@ namespace Ink_Canvas { public static string settingsFileName = "Settings.json"; private bool isLoaded = false; private bool forcePointEraser = false; + public static bool EnablePalmEraser = true; private void Window_Loaded(object sender, RoutedEventArgs e) { loadPenCanvas(); //加载设置 LoadSettings(true); + // 同步手掌擦开关 + EnablePalmEraser = Settings.Canvas.EnablePalmEraser; + if (ToggleSwitchEnablePalmEraser != null) + ToggleSwitchEnablePalmEraser.IsOn = EnablePalmEraser; // 加载自定义背景颜色 LoadCustomBackgroundColor(); @@ -398,6 +400,14 @@ namespace Ink_Canvas { // 初始化插件系统 InitializePluginSystem(); + + // 新增:确保EditingModeChanged事件已绑定 + var inkCanvas = this.FindName("inkCanvas") as InkCanvas; + if (inkCanvas != null) + { + inkCanvas.EditingModeChanged -= inkCanvas_EditingModeChanged; + inkCanvas.EditingModeChanged += inkCanvas_EditingModeChanged; + } } private void SystemEventsOnDisplaySettingsChanged(object sender, EventArgs e) { @@ -1341,5 +1351,13 @@ namespace Ink_Canvas { BorderSettings.Visibility = Visibility.Visible; BorderSettingsMask.Visibility = Visibility.Visible; } + + private void ToggleSwitchEnablePalmEraser_Toggled(object sender, RoutedEventArgs e) + { + if (!isLoaded) return; + EnablePalmEraser = ToggleSwitchEnablePalmEraser.IsOn; + Settings.Canvas.EnablePalmEraser = EnablePalmEraser; + SaveSettingsToFile(); + } } } \ No newline at end of file diff --git a/Ink Canvas/MainWindow_cs/MW_Eraser.cs b/Ink Canvas/MainWindow_cs/MW_Eraser.cs index 0a16cb5c..d80b1a41 100644 --- a/Ink Canvas/MainWindow_cs/MW_Eraser.cs +++ b/Ink Canvas/MainWindow_cs/MW_Eraser.cs @@ -634,52 +634,68 @@ namespace Ink_Canvas { // 绑定事件处理 overlay.MouseDown += (sender, e) => { + if (!MainWindow.EnablePalmEraser) return; + var inkCanvas = this.FindName("inkCanvas") as InkCanvas; if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { + lastEditingMode = inkCanvas.EditingMode; overlay.CaptureMouse(); + inkCanvas.EditingMode = InkCanvasEditingMode.None; StartAdvancedEraserOperation(sender); } }; overlay.MouseUp += (sender, e) => { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { + if (!MainWindow.EnablePalmEraser) return; + var inkCanvas = this.FindName("inkCanvas") as InkCanvas; + if (inkCanvas.EditingMode == InkCanvasEditingMode.None) { overlay.ReleaseMouseCapture(); EndAdvancedEraserOperation(sender); + inkCanvas.EditingMode = InkCanvasEditingMode.Ink; // 抬手后自动回到画笔 } }; overlay.MouseMove += (sender, e) => { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { + if (!MainWindow.EnablePalmEraser) return; + var inkCanvas = this.FindName("inkCanvas") as InkCanvas; + if (inkCanvas.EditingMode == InkCanvasEditingMode.None) { var position = e.GetPosition((UIElement)this.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 (!MainWindow.EnablePalmEraser) return; + var inkCanvas = this.FindName("inkCanvas") as InkCanvas; if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { e.Handled = true; if (e.StylusDevice.TabletDevice.Type == TabletDeviceType.Stylus) { overlay.CaptureStylus(); } + lastEditingMode = inkCanvas.EditingMode; + inkCanvas.EditingMode = InkCanvasEditingMode.None; StartAdvancedEraserOperation(sender); } }; overlay.StylusUp += (sender, e) => { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { + if (!MainWindow.EnablePalmEraser) return; + var inkCanvas = this.FindName("inkCanvas") as InkCanvas; + if (inkCanvas.EditingMode == InkCanvasEditingMode.None) { e.Handled = true; if (e.StylusDevice.TabletDevice.Type == TabletDeviceType.Stylus) { overlay.ReleaseStylusCapture(); } EndAdvancedEraserOperation(sender); + inkCanvas.EditingMode = InkCanvasEditingMode.Ink; // 抬手后自动回到画笔 } }; overlay.StylusMove += (sender, e) => { - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { + if (!MainWindow.EnablePalmEraser) return; + var inkCanvas = this.FindName("inkCanvas") as InkCanvas; + if (inkCanvas.EditingMode == InkCanvasEditingMode.None) { e.Handled = true; var position = e.GetPosition((UIElement)this.FindName("inkCanvas")); UpdateAdvancedEraserPosition(sender, position); diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs index 32a6a9eb..f55bc913 100644 --- a/Ink Canvas/Resources/Settings.cs +++ b/Ink Canvas/Resources/Settings.cs @@ -77,6 +77,8 @@ namespace Ink_Canvas public OptionalOperation HyperbolaAsymptoteOption { get; set; } = OptionalOperation.Ask; [JsonProperty("isCompressPicturesUploaded")] public bool IsCompressPicturesUploaded { get; set; } = false; + [JsonProperty("enablePalmEraser")] + public bool EnablePalmEraser { get; set; } = true; } public enum OptionalOperation