fix:issue #133
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
using Ink_Canvas.Helpers;
|
using Ink_Canvas.Helpers;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
@@ -343,6 +344,10 @@ namespace Ink_Canvas
|
|||||||
private InkCanvasEditingMode palmEraserLastEditingMode = InkCanvasEditingMode.Ink;
|
private InkCanvasEditingMode palmEraserLastEditingMode = InkCanvasEditingMode.Ink;
|
||||||
private bool palmEraserLastIsHighlighter;
|
private bool palmEraserLastIsHighlighter;
|
||||||
private bool palmEraserWasEnabledBeforeMultiTouch;
|
private bool palmEraserWasEnabledBeforeMultiTouch;
|
||||||
|
private bool palmEraserTouchDownHandled = false; // 新增:标记手掌擦触摸按下是否已处理
|
||||||
|
private DateTime palmEraserActivationTime; // 新增:记录手掌擦激活时间
|
||||||
|
private const int PALM_ERASER_TIMEOUT_MS = 5000; // 新增:手掌擦超时时间(5秒)
|
||||||
|
private System.Windows.Threading.DispatcherTimer palmEraserRecoveryTimer; // 新增:手掌擦恢复定时器
|
||||||
|
|
||||||
private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e)
|
private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e)
|
||||||
{
|
{
|
||||||
@@ -395,8 +400,8 @@ namespace Ink_Canvas
|
|||||||
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
|
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
|
||||||
dec.Add(e.TouchDevice.Id);
|
dec.Add(e.TouchDevice.Id);
|
||||||
|
|
||||||
// Palm Eraser 逻辑
|
// Palm Eraser 逻辑 - 修复:只在触摸按下时处理一次,避免重复触发
|
||||||
if (Settings.Canvas.EnablePalmEraser && dec.Count >= 2 && !isPalmEraserActive)
|
if (Settings.Canvas.EnablePalmEraser && dec.Count >= 2 && !isPalmEraserActive && !palmEraserTouchDownHandled)
|
||||||
{
|
{
|
||||||
var bounds = e.GetTouchPoint(inkCanvas).Bounds;
|
var bounds = e.GetTouchPoint(inkCanvas).Bounds;
|
||||||
double palmThreshold = 40; // 触摸面积阈值,可根据实际调整
|
double palmThreshold = 40; // 触摸面积阈值,可根据实际调整
|
||||||
@@ -408,6 +413,11 @@ namespace Ink_Canvas
|
|||||||
// 切换为橡皮擦
|
// 切换为橡皮擦
|
||||||
EraserIcon_Click(null, null);
|
EraserIcon_Click(null, null);
|
||||||
isPalmEraserActive = true;
|
isPalmEraserActive = true;
|
||||||
|
palmEraserActivationTime = DateTime.Now; // 记录激活时间
|
||||||
|
palmEraserTouchDownHandled = true; // 标记已处理
|
||||||
|
|
||||||
|
// 启动恢复定时器,防止卡死
|
||||||
|
StartPalmEraserRecoveryTimer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -474,23 +484,86 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
// 恢复高光状态
|
// 恢复高光状态
|
||||||
drawingAttributes.IsHighlighter = palmEraserLastIsHighlighter;
|
drawingAttributes.IsHighlighter = palmEraserLastIsHighlighter;
|
||||||
// 恢复编辑模式
|
// 恢复编辑模式 - 修复:确保正确恢复状态
|
||||||
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint)
|
try
|
||||||
{
|
{
|
||||||
if (palmEraserLastEditingMode == InkCanvasEditingMode.Ink)
|
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint)
|
||||||
{
|
{
|
||||||
PenIcon_Click(null, null);
|
if (palmEraserLastEditingMode == InkCanvasEditingMode.Ink)
|
||||||
}
|
{
|
||||||
else if (palmEraserLastEditingMode == InkCanvasEditingMode.Select)
|
PenIcon_Click(null, null);
|
||||||
{
|
}
|
||||||
SymbolIconSelect_MouseUp(null, null);
|
else if (palmEraserLastEditingMode == InkCanvasEditingMode.Select)
|
||||||
}
|
{
|
||||||
else
|
SymbolIconSelect_MouseUp(null, null);
|
||||||
{
|
}
|
||||||
inkCanvas.EditingMode = palmEraserLastEditingMode;
|
else
|
||||||
|
{
|
||||||
|
inkCanvas.EditingMode = palmEraserLastEditingMode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// 如果恢复失败,强制切换到批注模式
|
||||||
|
Trace.WriteLine($"Palm eraser recovery failed: {ex.Message}, forcing to Ink mode");
|
||||||
|
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置手掌擦状态
|
||||||
isPalmEraserActive = false;
|
isPalmEraserActive = false;
|
||||||
|
palmEraserTouchDownHandled = false;
|
||||||
|
|
||||||
|
// 停止恢复定时器
|
||||||
|
StopPalmEraserRecoveryTimer();
|
||||||
|
|
||||||
|
// 确保触摸事件能正常响应
|
||||||
|
inkCanvas.IsHitTestVisible = true;
|
||||||
|
inkCanvas.IsManipulationEnabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增:超时检测 - 如果手掌擦激活时间过长,强制重置状态
|
||||||
|
if (isPalmEraserActive && dec.Count == 0)
|
||||||
|
{
|
||||||
|
var timeSinceActivation = DateTime.Now - palmEraserActivationTime;
|
||||||
|
if (timeSinceActivation.TotalMilliseconds > PALM_ERASER_TIMEOUT_MS)
|
||||||
|
{
|
||||||
|
Trace.WriteLine($"Palm eraser timeout detected ({timeSinceActivation.TotalMilliseconds}ms), forcing recovery");
|
||||||
|
|
||||||
|
// 强制恢复状态
|
||||||
|
try
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Trace.WriteLine($"Palm eraser timeout recovery failed: {ex.Message}, forcing to Ink mode");
|
||||||
|
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置所有手掌擦状态
|
||||||
|
isPalmEraserActive = false;
|
||||||
|
palmEraserTouchDownHandled = false;
|
||||||
|
inkCanvas.IsHitTestVisible = true;
|
||||||
|
inkCanvas.IsManipulationEnabled = true;
|
||||||
|
|
||||||
|
// 停止恢复定时器
|
||||||
|
StopPalmEraserRecoveryTimer();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// 修复:几何绘制模式下,触摸抬手时应该正确处理,而不是简单模拟鼠标事件
|
// 修复:几何绘制模式下,触摸抬手时应该正确处理,而不是简单模拟鼠标事件
|
||||||
if (drawingShapeMode != 0)
|
if (drawingShapeMode != 0)
|
||||||
@@ -551,6 +624,16 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
inkCanvas.EditingMode = lastInkCanvasEditingMode;
|
inkCanvas.EditingMode = lastInkCanvasEditingMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 修复:确保手掌擦除后触摸事件能正常响应
|
||||||
|
if (isPalmEraserActive)
|
||||||
|
{
|
||||||
|
// 如果手掌擦还在激活状态但触摸点已清空,强制重置状态
|
||||||
|
isPalmEraserActive = false;
|
||||||
|
palmEraserTouchDownHandled = false;
|
||||||
|
inkCanvas.IsHitTestVisible = true;
|
||||||
|
inkCanvas.IsManipulationEnabled = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inkCanvas.Opacity = 1;
|
inkCanvas.Opacity = 1;
|
||||||
@@ -753,5 +836,80 @@ namespace Ink_Canvas
|
|||||||
ToggleSwitchEnablePalmEraser.IsOn = false;
|
ToggleSwitchEnablePalmEraser.IsOn = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 启动手掌擦恢复定时器,防止卡死状态
|
||||||
|
/// </summary>
|
||||||
|
private void StartPalmEraserRecoveryTimer()
|
||||||
|
{
|
||||||
|
if (palmEraserRecoveryTimer == null)
|
||||||
|
{
|
||||||
|
palmEraserRecoveryTimer = new System.Windows.Threading.DispatcherTimer();
|
||||||
|
palmEraserRecoveryTimer.Interval = TimeSpan.FromMilliseconds(1000); // 每秒检查一次
|
||||||
|
palmEraserRecoveryTimer.Tick += PalmEraserRecoveryTimer_Tick;
|
||||||
|
}
|
||||||
|
|
||||||
|
palmEraserRecoveryTimer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 停止手掌擦恢复定时器
|
||||||
|
/// </summary>
|
||||||
|
private void StopPalmEraserRecoveryTimer()
|
||||||
|
{
|
||||||
|
if (palmEraserRecoveryTimer != null)
|
||||||
|
{
|
||||||
|
palmEraserRecoveryTimer.Stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 手掌擦恢复定时器事件处理
|
||||||
|
/// </summary>
|
||||||
|
private void PalmEraserRecoveryTimer_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (!isPalmEraserActive) return;
|
||||||
|
|
||||||
|
// 检查是否超时
|
||||||
|
var timeSinceActivation = DateTime.Now - palmEraserActivationTime;
|
||||||
|
if (timeSinceActivation.TotalMilliseconds > PALM_ERASER_TIMEOUT_MS)
|
||||||
|
{
|
||||||
|
Trace.WriteLine($"Palm eraser recovery timer triggered, forcing recovery after {timeSinceActivation.TotalMilliseconds}ms");
|
||||||
|
|
||||||
|
// 强制恢复状态
|
||||||
|
try
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Trace.WriteLine($"Palm eraser recovery timer failed: {ex.Message}, forcing to Ink mode");
|
||||||
|
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置所有手掌擦状态
|
||||||
|
isPalmEraserActive = false;
|
||||||
|
palmEraserTouchDownHandled = false;
|
||||||
|
inkCanvas.IsHitTestVisible = true;
|
||||||
|
inkCanvas.IsManipulationEnabled = true;
|
||||||
|
|
||||||
|
// 停止定时器
|
||||||
|
StopPalmEraserRecoveryTimer();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user