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