deletefix:issue #210
This commit is contained in:
@@ -3670,6 +3670,7 @@
|
|||||||
IsManipulationEnabled="True"
|
IsManipulationEnabled="True"
|
||||||
EditingModeChanged="inkCanvas_EditingModeChanged"
|
EditingModeChanged="inkCanvas_EditingModeChanged"
|
||||||
PreviewTouchDown="inkCanvas_PreviewTouchDown"
|
PreviewTouchDown="inkCanvas_PreviewTouchDown"
|
||||||
|
PreviewTouchMove="inkCanvas_PreviewTouchMove"
|
||||||
PreviewTouchUp="inkCanvas_PreviewTouchUp"
|
PreviewTouchUp="inkCanvas_PreviewTouchUp"
|
||||||
MouseDown="inkCanvas_MouseDown"
|
MouseDown="inkCanvas_MouseDown"
|
||||||
MouseMove="inkCanvas_MouseMove"
|
MouseMove="inkCanvas_MouseMove"
|
||||||
|
|||||||
@@ -2900,11 +2900,6 @@ namespace Ink_Canvas
|
|||||||
ViewboxFloatingBar.IsHitTestVisible = true;
|
ViewboxFloatingBar.IsHitTestVisible = true;
|
||||||
BlackboardUIGridForInkReplay.IsHitTestVisible = true;
|
BlackboardUIGridForInkReplay.IsHitTestVisible = true;
|
||||||
|
|
||||||
// 重置书写保护相关状态
|
|
||||||
isWritingInProgress = false;
|
|
||||||
touchDownTimes.Clear();
|
|
||||||
touchDownPositions.Clear();
|
|
||||||
lastTouchPositions.Clear();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -22,16 +22,6 @@ namespace Ink_Canvas
|
|||||||
private bool isSingleFingerDragMode;
|
private bool isSingleFingerDragMode;
|
||||||
private Point centerPoint = new Point(0, 0);
|
private Point centerPoint = new Point(0, 0);
|
||||||
private InkCanvasEditingMode lastInkCanvasEditingMode = InkCanvasEditingMode.Ink;
|
private InkCanvasEditingMode lastInkCanvasEditingMode = InkCanvasEditingMode.Ink;
|
||||||
|
|
||||||
// 书写保护相关变量
|
|
||||||
private bool isWritingInProgress = false;
|
|
||||||
private DateTime lastTouchDownTime = DateTime.Now;
|
|
||||||
private const int WRITING_PROTECTION_DELAY_MS = 200; // 书写保护延迟时间(毫秒)
|
|
||||||
private Dictionary<int, DateTime> touchDownTimes = new Dictionary<int, DateTime>();
|
|
||||||
private Dictionary<int, Point> touchDownPositions = new Dictionary<int, Point>();
|
|
||||||
private Dictionary<int, Point> lastTouchPositions = new Dictionary<int, Point>();
|
|
||||||
private const double GESTURE_MOVEMENT_THRESHOLD = 20.0; // 手势移动阈值(像素)
|
|
||||||
private const double WRITING_MOVEMENT_THRESHOLD = 5.0; // 书写移动阈值(像素)
|
|
||||||
/// 保存画布上的非笔画元素(如图片、媒体元素等)
|
/// 保存画布上的非笔画元素(如图片、媒体元素等)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private List<UIElement> PreserveNonStrokeElements()
|
private List<UIElement> PreserveNonStrokeElements()
|
||||||
@@ -346,13 +336,12 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
var stroke = GetStrokeVisual(e.StylusDevice.Id).Stroke;
|
var stroke = GetStrokeVisual(e.StylusDevice.Id).Stroke;
|
||||||
|
|
||||||
// 正常模式:添加到画布并参与墨迹纠正
|
|
||||||
inkCanvas.Strokes.Add(stroke);
|
inkCanvas.Strokes.Add(stroke);
|
||||||
await Task.Delay(5);
|
await Task.Delay(5);
|
||||||
inkCanvas.Children.Remove(GetVisualCanvas(e.StylusDevice.Id));
|
inkCanvas.Children.Remove(GetVisualCanvas(e.StylusDevice.Id));
|
||||||
|
|
||||||
inkCanvas_StrokeCollected(inkCanvas,
|
inkCanvas_StrokeCollected(inkCanvas,
|
||||||
new InkCanvasStrokeCollectedEventArgs(stroke));
|
new InkCanvasStrokeCollectedEventArgs(stroke));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -578,17 +567,6 @@ namespace Ink_Canvas
|
|||||||
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
|
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
|
||||||
dec.Add(e.TouchDevice.Id);
|
dec.Add(e.TouchDevice.Id);
|
||||||
|
|
||||||
// 记录触摸按下时间和位置,用于书写保护判断
|
|
||||||
touchDownTimes[e.TouchDevice.Id] = DateTime.Now;
|
|
||||||
touchDownPositions[e.TouchDevice.Id] = e.GetTouchPoint(inkCanvas).Position;
|
|
||||||
|
|
||||||
// 如果是第一个触摸点,标记书写开始
|
|
||||||
if (dec.Count == 1)
|
|
||||||
{
|
|
||||||
isWritingInProgress = true;
|
|
||||||
lastTouchDownTime = DateTime.Now;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Palm Eraser 逻辑
|
// Palm Eraser 逻辑
|
||||||
if (Settings.Canvas.EnablePalmEraser && !isPalmEraserActive)
|
if (Settings.Canvas.EnablePalmEraser && !isPalmEraserActive)
|
||||||
{
|
{
|
||||||
@@ -656,7 +634,6 @@ namespace Ink_Canvas
|
|||||||
touchPoint = e.GetTouchPoint(inkCanvas);
|
touchPoint = e.GetTouchPoint(inkCanvas);
|
||||||
centerPoint = touchPoint.Position;
|
centerPoint = touchPoint.Position;
|
||||||
|
|
||||||
// 修复:只允许在此处赋值iniP,防止TouchMove等其他地方覆盖,保证几何绘制起点一致
|
|
||||||
if (drawingShapeMode != 0)
|
if (drawingShapeMode != 0)
|
||||||
{
|
{
|
||||||
// 对于双曲线绘制,第一笔时记录起点,第二笔时不更新起点
|
// 对于双曲线绘制,第一笔时记录起点,第二笔时不更新起点
|
||||||
@@ -686,37 +663,18 @@ namespace Ink_Canvas
|
|||||||
if (inkCanvas.EditingMode == InkCanvasEditingMode.None ||
|
if (inkCanvas.EditingMode == InkCanvasEditingMode.None ||
|
||||||
inkCanvas.EditingMode == InkCanvasEditingMode.Select) return;
|
inkCanvas.EditingMode == InkCanvasEditingMode.Select) return;
|
||||||
|
|
||||||
// 书写保护:如果正在书写且时间间隔很短,延迟禁用画笔功能
|
|
||||||
if (isWritingInProgress && dec.Count == 2)
|
|
||||||
{
|
|
||||||
var timeSinceFirstTouch = DateTime.Now - lastTouchDownTime;
|
|
||||||
if (timeSinceFirstTouch.TotalMilliseconds < WRITING_PROTECTION_DELAY_MS)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lastInkCanvasEditingMode = inkCanvas.EditingMode;
|
lastInkCanvasEditingMode = inkCanvas.EditingMode;
|
||||||
// 修复:几何绘制模式下禁止切回Ink
|
|
||||||
if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint
|
if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint
|
||||||
&& inkCanvas.EditingMode != InkCanvasEditingMode.EraseByStroke
|
&& inkCanvas.EditingMode != InkCanvasEditingMode.EraseByStroke
|
||||||
&& drawingShapeMode == 0)
|
&& drawingShapeMode == 0)
|
||||||
{
|
{
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 清除书写状态
|
|
||||||
isWritingInProgress = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void inkCanvas_PreviewTouchMove(object sender, TouchEventArgs e)
|
private void inkCanvas_PreviewTouchMove(object sender, TouchEventArgs e)
|
||||||
{
|
{
|
||||||
// 更新触摸位置记录,用于手势检测
|
|
||||||
if (lastTouchPositions.ContainsKey(e.TouchDevice.Id))
|
|
||||||
{
|
|
||||||
lastTouchPositions[e.TouchDevice.Id] = e.GetTouchPoint(inkCanvas).Position;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果手掌擦激活,更新橡皮擦反馈位置
|
// 如果手掌擦激活,更新橡皮擦反馈位置
|
||||||
if (isPalmEraserActive)
|
if (isPalmEraserActive)
|
||||||
@@ -740,16 +698,6 @@ namespace Ink_Canvas
|
|||||||
// Palm Eraser 逻辑
|
// Palm Eraser 逻辑
|
||||||
dec.Remove(e.TouchDevice.Id);
|
dec.Remove(e.TouchDevice.Id);
|
||||||
|
|
||||||
// 清理触摸记录
|
|
||||||
touchDownTimes.Remove(e.TouchDevice.Id);
|
|
||||||
touchDownPositions.Remove(e.TouchDevice.Id);
|
|
||||||
lastTouchPositions.Remove(e.TouchDevice.Id);
|
|
||||||
|
|
||||||
// 如果所有触摸点都抬起,清除书写状态
|
|
||||||
if (dec.Count == 0)
|
|
||||||
{
|
|
||||||
isWritingInProgress = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 当手掌擦激活且所有触摸点都抬起时,恢复原编辑模式
|
// 当手掌擦激活且所有触摸点都抬起时,恢复原编辑模式
|
||||||
if (isPalmEraserActive && dec.Count == 0)
|
if (isPalmEraserActive && dec.Count == 0)
|
||||||
@@ -1214,54 +1162,5 @@ namespace Ink_Canvas
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 检测是否为手势操作而非书写
|
|
||||||
/// </summary>
|
|
||||||
private bool IsGestureOperation()
|
|
||||||
{
|
|
||||||
if (dec.Count < 2) return false;
|
|
||||||
|
|
||||||
// 检查触摸点之间的移动模式
|
|
||||||
var currentTime = DateTime.Now;
|
|
||||||
var gestureIndicators = 0;
|
|
||||||
var totalMovement = 0.0;
|
|
||||||
|
|
||||||
foreach (var touchId in dec)
|
|
||||||
{
|
|
||||||
if (touchDownTimes.ContainsKey(touchId) && touchDownPositions.ContainsKey(touchId) && lastTouchPositions.ContainsKey(touchId))
|
|
||||||
{
|
|
||||||
var timeSinceTouch = currentTime - touchDownTimes[touchId];
|
|
||||||
var initialPosition = touchDownPositions[touchId];
|
|
||||||
var currentPosition = lastTouchPositions[touchId];
|
|
||||||
|
|
||||||
// 计算移动距离
|
|
||||||
var movement = Math.Sqrt(Math.Pow(currentPosition.X - initialPosition.X, 2) +
|
|
||||||
Math.Pow(currentPosition.Y - initialPosition.Y, 2));
|
|
||||||
totalMovement += movement;
|
|
||||||
|
|
||||||
// 综合判断:时间、移动距离和触摸点数量
|
|
||||||
if (timeSinceTouch.TotalMilliseconds < WRITING_PROTECTION_DELAY_MS && movement < WRITING_MOVEMENT_THRESHOLD)
|
|
||||||
{
|
|
||||||
// 短时间、小移动 - 可能是书写
|
|
||||||
gestureIndicators--;
|
|
||||||
}
|
|
||||||
else if (timeSinceTouch.TotalMilliseconds > WRITING_PROTECTION_DELAY_MS || movement > GESTURE_MOVEMENT_THRESHOLD)
|
|
||||||
{
|
|
||||||
// 长时间或大移动 - 可能是手势
|
|
||||||
gestureIndicators++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果平均移动距离很大,更可能是手势
|
|
||||||
var averageMovement = totalMovement / dec.Count;
|
|
||||||
if (averageMovement > GESTURE_MOVEMENT_THRESHOLD)
|
|
||||||
{
|
|
||||||
gestureIndicators += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果大部分触摸点都满足手势条件,认为是手势操作
|
|
||||||
return gestureIndicators > 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user