diff --git a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs index 65fe9973..26813344 100644 --- a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs +++ b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs @@ -8,6 +8,7 @@ using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; +using Ink_Canvas.Helpers; using Point = System.Windows.Point; namespace Ink_Canvas @@ -533,8 +534,9 @@ namespace Ink_Canvas updateBorderStrokeSelectionControlLocation(); } } - catch + catch (Exception ex) { + LogHelper.WriteLogToFile($"墨迹ManipulationDelta错误: {ex.Message}", LogHelper.LogType.Error); } } @@ -552,24 +554,33 @@ namespace Ink_Canvas if (inkCanvas.GetSelectedStrokes().Count > 0 && dec.Count == 1) { var currentTouchPoint = e.GetTouchPoint(inkCanvas).Position; - var delta = currentTouchPoint - lastTouchPointOnGridInkCanvasCover; - // 创建变换矩阵 - var matrix = new Matrix(); - matrix.Translate(delta.X, delta.Y); - - // 对选中的墨迹应用变换 - var selectedStrokes = inkCanvas.GetSelectedStrokes(); - foreach (var stroke in selectedStrokes) + // 检查是否有有效的起始触摸点 + if (lastTouchPointOnGridInkCanvasCover != new Point(0, 0)) { - stroke.Transform(matrix, false); + var delta = currentTouchPoint - lastTouchPointOnGridInkCanvasCover; + + // 只有当移动距离足够大时才进行拖动(避免微小移动造成的抖动) + if (Math.Abs(delta.X) > 1 || Math.Abs(delta.Y) > 1) + { + // 创建变换矩阵 + var matrix = new Matrix(); + matrix.Translate(delta.X, delta.Y); + + // 对选中的墨迹应用变换 + var selectedStrokes = inkCanvas.GetSelectedStrokes(); + foreach (var stroke in selectedStrokes) + { + stroke.Transform(matrix, false); + } + + // 更新选中栏位置 + updateBorderStrokeSelectionControlLocation(); + + // 更新最后触摸点 + lastTouchPointOnGridInkCanvasCover = currentTouchPoint; + } } - - // 更新选中栏位置 - updateBorderStrokeSelectionControlLocation(); - - // 更新最后触摸点 - lastTouchPointOnGridInkCanvasCover = currentTouchPoint; } } @@ -579,24 +590,33 @@ namespace Ink_Canvas if (inkCanvas.GetSelectedStrokes().Count > 0 && dec.Count == 1) { var currentTouchPoint = e.GetTouchPoint(inkCanvas).Position; - var delta = currentTouchPoint - lastTouchPointOnGridInkCanvasCover; - // 创建变换矩阵 - var matrix = new Matrix(); - matrix.Translate(delta.X, delta.Y); - - // 对选中的墨迹应用变换 - var selectedStrokes = inkCanvas.GetSelectedStrokes(); - foreach (var stroke in selectedStrokes) + // 检查是否有有效的起始触摸点 + if (lastTouchPointOnGridInkCanvasCover != new Point(0, 0)) { - stroke.Transform(matrix, false); + var delta = currentTouchPoint - lastTouchPointOnGridInkCanvasCover; + + // 只有当移动距离足够大时才进行拖动(避免微小移动造成的抖动) + if (Math.Abs(delta.X) > 1 || Math.Abs(delta.Y) > 1) + { + // 创建变换矩阵 + var matrix = new Matrix(); + matrix.Translate(delta.X, delta.Y); + + // 对选中的墨迹应用变换 + var selectedStrokes = inkCanvas.GetSelectedStrokes(); + foreach (var stroke in selectedStrokes) + { + stroke.Transform(matrix, false); + } + + // 更新选中栏位置 + updateBorderStrokeSelectionControlLocation(); + + // 更新最后触摸点 + lastTouchPointOnGridInkCanvasCover = currentTouchPoint; + } } - - // 更新选中栏位置 - updateBorderStrokeSelectionControlLocation(); - - // 更新最后触摸点 - lastTouchPointOnGridInkCanvasCover = currentTouchPoint; } } @@ -625,8 +645,8 @@ namespace Ink_Canvas touchPosition.Y >= selectionBounds.Top && touchPosition.Y <= selectionBounds.Bottom) { - // 只有在选择框边界内才允许拖动 - // 触摸拖动状态已通过TouchMove事件处理 + // 只有在选择框边界内才允许拖动 + // 触摸拖动状态已通过TouchMove事件处理 } else { @@ -661,13 +681,32 @@ namespace Ink_Canvas { dec.Remove(e.TouchDevice.Id); if (dec.Count >= 1) return; + + // 重置触摸状态 + lastTouchPointOnGridInkCanvasCover = new Point(0, 0); isProgramChangeStrokeSelection = false; - if (lastTouchPointOnGridInkCanvasCover == e.GetTouchPoint(null).Position) + + // 检查是否有点击(没有移动) + var currentTouchPoint = e.GetTouchPoint(null).Position; + if (Math.Abs(currentTouchPoint.X - centerPoint.X) < 5 && Math.Abs(currentTouchPoint.Y - centerPoint.Y) < 5) { - if (!(lastTouchPointOnGridInkCanvasCover.X < inkCanvas.GetSelectionBounds().Left) && - !(lastTouchPointOnGridInkCanvasCover.Y < inkCanvas.GetSelectionBounds().Top) && - !(lastTouchPointOnGridInkCanvasCover.X > inkCanvas.GetSelectionBounds().Right) && - !(lastTouchPointOnGridInkCanvasCover.Y > inkCanvas.GetSelectionBounds().Bottom)) return; + // 点击在选择框内,保持选择状态 + if (inkCanvas.GetSelectedStrokes().Count > 0) + { + var selectionBounds = inkCanvas.GetSelectionBounds(); + if (currentTouchPoint.X >= selectionBounds.Left && + currentTouchPoint.X <= selectionBounds.Right && + currentTouchPoint.Y >= selectionBounds.Top && + currentTouchPoint.Y <= selectionBounds.Bottom) + { + // 点击在选择框内,保持选择 + GridInkCanvasSelectionCover.Visibility = Visibility.Visible; + StrokesSelectionClone = new StrokeCollection(); + return; + } + } + + // 点击在选择框外,取消选择 inkCanvas.Select(new StrokeCollection()); StrokesSelectionClone = new StrokeCollection(); } @@ -681,6 +720,7 @@ namespace Ink_Canvas GridInkCanvasSelectionCover.Visibility = Visibility.Visible; StrokesSelectionClone = new StrokeCollection(); } + } private void LassoSelect_Click(object sender, RoutedEventArgs e) diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index a5f6af9c..8d1c48c8 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -369,7 +369,8 @@ namespace Ink_Canvas } if (inkCanvas.EditingMode == InkCanvasEditingMode.Select) { - // 套索选状态下只return,保证套索选可用 + // 套索选状态下不直接return,允许触摸事件继续处理 + dec.Add(e.TouchDevice.Id); return; } // 修复:几何绘制模式下完全禁止触摸轨迹收集 @@ -864,7 +865,34 @@ namespace Ink_Canvas return; // 三指及以上禁止缩放 bool disableScale = dec.Count >= 3; - if (isInMultiTouchMode || !Settings.Gesture.IsEnableTwoFingerGesture) return; + + // 修复:允许单指拖动选中的墨迹,即使禁用了多指手势 + if (isInMultiTouchMode) return; + + // 如果是单指拖动选中的墨迹,允许处理 + if (dec.Count == 1 && inkCanvas.GetSelectedStrokes().Count > 0) + { + var md = e.DeltaManipulation; + var trans = md.Translation; // 获得位移矢量 + + if (trans.X != 0 || trans.Y != 0) + { + var m = new Matrix(); + m.Translate(trans.X, trans.Y); // 移动 + + var strokes = inkCanvas.GetSelectedStrokes(); + foreach (var stroke in strokes) + { + stroke.Transform(m, false); + } + + // 更新选择框位置 + updateBorderStrokeSelectionControlLocation(); + } + return; + } + + if (!Settings.Gesture.IsEnableTwoFingerGesture) return; if ((dec.Count >= 2 && (Settings.PowerPointSettings.IsEnableTwoFingerGestureInPresentationMode || StackPanelPPTControls.Visibility != Visibility.Visible || StackPanelPPTButtons.Visibility == Visibility.Collapsed)) ||