From abf52f0d49ac1802cdd1b089f2c54763e839139a Mon Sep 17 00:00:00 2001
From: CJKmkp <2564608840@qq.com>
Date: Wed, 23 Jul 2025 23:05:28 +0800
Subject: [PATCH] =?UTF-8?q?add:=E6=96=B0=E7=89=88=E6=89=8B=E6=8E=8C?=
=?UTF-8?q?=E6=93=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Ink Canvas/MainWindow.xaml | 10 +++++
Ink Canvas/MainWindow_cs/MW_Settings.cs | 6 +++
Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs | 5 +++
Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 38 ++++++++++++++++++-
Ink Canvas/Resources/Settings.cs | 2 +
5 files changed, 59 insertions(+), 2 deletions(-)
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