diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 7df138b9..2853a931 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -851,6 +851,16 @@ + + + + + + diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index 23838114..3b7e9635 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -2189,5 +2189,11 @@ namespace Ink_Canvas { Settings.Automation.IsAutoEnterAnnotationAfterKillHite = ToggleSwitchAutoEnterAnnotationAfterKillHite.IsOn; SaveSettingsToFile(); } + + private void ToggleSwitchEnablePalmEraser_Toggled(object sender, RoutedEventArgs e) { + if (!isLoaded) return; + Settings.Canvas.EnablePalmEraser = ToggleSwitchEnablePalmEraser.IsOn; + SaveSettingsToFile(); + } } } diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index 8dea9ac2..d122a8ae 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -554,6 +554,11 @@ namespace Ink_Canvas { Settings.Canvas = new Canvas(); } + // Palm Eraser + if (Settings.Canvas != null) { + ToggleSwitchEnablePalmEraser.IsOn = Settings.Canvas.EnablePalmEraser; + } + // Advanced if (Settings.Advanced != null) { TouchMultiplierSlider.Value = Settings.Advanced.TouchMultiplier; diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index f2ac48c9..3d03ba51 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -219,6 +219,11 @@ namespace Ink_Canvas { } } + // 手掌擦相关变量 + private bool isPalmEraserActive = false; + private InkCanvasEditingMode palmEraserLastEditingMode = InkCanvasEditingMode.Ink; + private bool palmEraserLastIsHighlighter = false; + private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e) { // 橡皮状态下不做任何切换,直接return,保证橡皮可持续 if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { @@ -231,6 +236,19 @@ namespace Ink_Canvas { BlackboardUIGridForInkReplay.IsHitTestVisible = false; dec.Add(e.TouchDevice.Id); + // Palm Eraser 逻辑 + if (Settings.Canvas.EnablePalmEraser && dec.Count >= 2 && !isPalmEraserActive) { + var bounds = e.GetTouchPoint(inkCanvas).Bounds; + double palmThreshold = 40; // 触摸面积阈值,可根据实际调整 + if (bounds.Width >= palmThreshold || bounds.Height >= palmThreshold) { + // 记录当前编辑模式和高光状态 + palmEraserLastEditingMode = inkCanvas.EditingMode; + palmEraserLastIsHighlighter = drawingAttributes.IsHighlighter; + // 切换为橡皮擦 + EraserIcon_Click(null, null); + isPalmEraserActive = true; + } + } //设备1个的时候,记录中心点 if (dec.Count == 1) { var touchPoint = e.GetTouchPoint(inkCanvas); @@ -258,13 +276,30 @@ namespace Ink_Canvas { private void inkCanvas_PreviewTouchUp(object sender, TouchEventArgs e) { // 橡皮状态下不做任何切换,直接return,保证橡皮可持续 - if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { + if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint && !isPalmEraserActive) { return; } inkCanvas.ReleaseAllTouchCaptures(); ViewboxFloatingBar.IsHitTestVisible = true; BlackboardUIGridForInkReplay.IsHitTestVisible = true; + // Palm Eraser 逻辑:所有点抬起后恢复原编辑模式 + dec.Remove(e.TouchDevice.Id); + if (isPalmEraserActive && dec.Count == 0) { + // 恢复高光状态 + drawingAttributes.IsHighlighter = palmEraserLastIsHighlighter; + // 恢复编辑模式 + if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) { + if (palmEraserLastEditingMode == InkCanvasEditingMode.Ink) { + PenIcon_Click(null, null); + } else if (palmEraserLastEditingMode == InkCanvasEditingMode.Select) { + SymbolIconSelect_MouseUp(null, null); + } else { + inkCanvas.EditingMode = palmEraserLastEditingMode; + } + } + isPalmEraserActive = false; + } // 新增:几何绘制模式下,触摸抬手时自动落笔 if (drawingShapeMode != 0) { var mouseArgs = new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left) @@ -281,7 +316,6 @@ namespace Ink_Canvas { if (lastInkCanvasEditingMode != InkCanvasEditingMode.EraseByPoint) { inkCanvas.EditingMode = lastInkCanvasEditingMode; } - dec.Remove(e.TouchDevice.Id); inkCanvas.Opacity = 1; if (dec.Count == 0) diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs index 32a6a9eb..76ebba98 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; } = false; } public enum OptionalOperation