diff --git a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs index 97b37634..0daf4189 100644 --- a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs +++ b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs @@ -196,7 +196,16 @@ namespace Ink_Canvas { if (sender is FrameworkElement element) { - // 使用触摸拖动的完整实现 + // 检查是否是双指手势 + if (e.Manipulators.Count() >= 2) + { + // 双指手势时,不处理单个元素的手势,让画布级别的手势处理 + // 这样可以实现图片与墨迹的同步移动 + e.Handled = false; + return; + } + + // 单指手势时,使用触摸拖动的完整实现 ApplyTouchManipulationTransform(element, e); // 如果是图片元素,更新工具栏位置 diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index f03b5cbc..8e9c40dc 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -1069,12 +1069,15 @@ namespace Ink_Canvas catch { } } - ; + // 同时变换画布上的图片元素 + TransformCanvasImages(m); } else { foreach (var stroke in inkCanvas.Strokes) stroke.Transform(m, false); - ; + + // 同时变换画布上的图片元素 + TransformCanvasImages(m); } foreach (var circle in circles) @@ -1092,6 +1095,86 @@ namespace Ink_Canvas } } + /// + /// 变换画布上的图片元素,使其与墨迹同步移动 + /// + private void TransformCanvasImages(Matrix matrix) + { + try + { + // 遍历inkCanvas的所有子元素,找到图片元素 + for (int i = inkCanvas.Children.Count - 1; i >= 0; i--) + { + var child = inkCanvas.Children[i]; + + if (child is Image image) + { + // 应用矩阵变换到图片 + ApplyMatrixTransformToImage(image, matrix); + } + else if (child is MediaElement mediaElement) + { + // 对媒体元素也应用变换 + ApplyMatrixTransformToMediaElement(mediaElement, matrix); + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"变换画布图片失败: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 对图片应用矩阵变换 + /// + private void ApplyMatrixTransformToImage(Image image, Matrix matrix) + { + try + { + // 获取图片的RenderTransform,如果不存在则创建新的TransformGroup + TransformGroup transformGroup = image.RenderTransform as TransformGroup; + if (transformGroup == null) + { + transformGroup = new TransformGroup(); + image.RenderTransform = transformGroup; + } + + // 创建新的MatrixTransform并添加到变换组 + var matrixTransform = new MatrixTransform(matrix); + transformGroup.Children.Add(matrixTransform); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"应用图片变换失败: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 对媒体元素应用矩阵变换 + /// + private void ApplyMatrixTransformToMediaElement(MediaElement mediaElement, Matrix matrix) + { + try + { + // 获取媒体元素的RenderTransform,如果不存在则创建新的TransformGroup + TransformGroup transformGroup = mediaElement.RenderTransform as TransformGroup; + if (transformGroup == null) + { + transformGroup = new TransformGroup(); + mediaElement.RenderTransform = transformGroup; + } + + // 创建新的MatrixTransform并添加到变换组 + var matrixTransform = new MatrixTransform(matrix); + transformGroup.Children.Add(matrixTransform); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"应用媒体元素变换失败: {ex.Message}", LogHelper.LogType.Error); + } + } + // 退出多指书写模式,恢复InkCanvas的TouchDown事件绑定 private void ExitMultiTouchModeIfNeeded() {