From dcd2f52c59107f70f4a48a1e98cc749dbcc0a0a8 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Mon, 28 Jul 2025 19:02:45 +0800 Subject: [PATCH] =?UTF-8?q?improve:=E6=8F=92=E5=85=A5=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AutomaticUpdateVersionControl.txt | 2 +- Ink Canvas/MainWindow.xaml | 46 ++++++++++ Ink Canvas/MainWindow.xaml.cs | 28 ++++++ .../MainWindow_cs/MW_ElementsControls.cs | 85 +++++++++++++++++++ .../MainWindow_cs/MW_SelectionGestures.cs | 62 +++++++++++++- 5 files changed, 220 insertions(+), 3 deletions(-) diff --git a/AutomaticUpdateVersionControl.txt b/AutomaticUpdateVersionControl.txt index 6afaf40c..823a14ad 100644 --- a/AutomaticUpdateVersionControl.txt +++ b/AutomaticUpdateVersionControl.txt @@ -1 +1 @@ -1.7.4.0 +1.7.5.0 diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 081c9693..13acc9ef 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -3149,6 +3149,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index d6817dd7..c96ff4b5 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -1475,5 +1475,33 @@ namespace Ink_Canvas { SaveSettingsToFile(); ApplyNoFocusMode(); } + + #region Image Toolbar Event Handlers + + private void BorderImageRotateLeft_MouseUp(object sender, MouseButtonEventArgs e) + { + if (selectedUIElement is Image image) + { + RotateImage(image, -90); + } + } + + private void BorderImageRotateRight_MouseUp(object sender, MouseButtonEventArgs e) + { + if (selectedUIElement is Image image) + { + RotateImage(image, 90); + } + } + + private void BorderImageDelete_MouseUp(object sender, MouseButtonEventArgs e) + { + if (selectedUIElement is Image image) + { + DeleteImage(image); + } + } + + #endregion } } \ No newline at end of file diff --git a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs index eb831fca..df09130b 100644 --- a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs +++ b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs @@ -171,5 +171,90 @@ namespace Ink_Canvas }); } #endregion + + #region Image Operations + + /// + /// 旋转图片 + /// + /// 要旋转的图片 + /// 旋转角度(正数为顺时针,负数为逆时针) + private void RotateImage(Image image, double angle) + { + if (image == null) return; + + try + { + // 获取当前的变换 + var transformGroup = image.RenderTransform as TransformGroup ?? new TransformGroup(); + + // 查找现有的旋转变换 + RotateTransform rotateTransform = null; + foreach (Transform transform in transformGroup.Children) + { + if (transform is RotateTransform rt) + { + rotateTransform = rt; + break; + } + } + + // 如果没有旋转变换,创建一个新的 + if (rotateTransform == null) + { + rotateTransform = new RotateTransform(); + transformGroup.Children.Add(rotateTransform); + } + + // 设置旋转中心为图片中心 + rotateTransform.CenterX = image.ActualWidth / 2; + rotateTransform.CenterY = image.ActualHeight / 2; + + // 累加旋转角度 + rotateTransform.Angle = (rotateTransform.Angle + angle) % 360; + + // 应用变换 + image.RenderTransform = transformGroup; + + // 提交到时间机器以支持撤销 + // 注意:旋转操作目前不支持撤销,因为需要更复杂的历史记录机制 + } + catch (Exception ex) + { + // 记录错误但不中断程序 + System.Diagnostics.Debug.WriteLine($"旋转图片时发生错误: {ex.Message}"); + } + } + + /// + /// 删除图片 + /// + /// 要删除的图片 + private void DeleteImage(Image image) + { + if (image == null) return; + + try + { + // 从画布中移除图片 + if (inkCanvas.Children.Contains(image)) + { + inkCanvas.Children.Remove(image); + + // 取消选择 + DeselectUIElement(); + + // 提交到时间机器以支持撤销 + timeMachine.CommitElementRemoveHistory(image); + } + } + catch (Exception ex) + { + // 记录错误但不中断程序 + System.Diagnostics.Debug.WriteLine($"删除图片时发生错误: {ex.Message}"); + } + } + + #endregion } } diff --git a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs index 4f939a32..dc3c2c53 100644 --- a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs +++ b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs @@ -467,6 +467,11 @@ namespace Ink_Canvas { private Point resizeStartPoint; private Rect originalElementBounds; + // 图片工具栏相关 + private Border borderImageSelectionControl; + private double BorderImageSelectionControlWidth = 200.0; + private double BorderImageSelectionControlHeight = 80.0; + private enum ResizeDirection { None, @@ -501,6 +506,12 @@ namespace Ink_Canvas { } } + // 初始化图片工具栏引用 + if (borderImageSelectionControl == null) + { + borderImageSelectionControl = FindName("BorderImageSelectionControl") as Border; + } + // 创建8个拖拽手柄 CreateResizeHandles(); } @@ -585,8 +596,16 @@ namespace Ink_Canvas { InitializeUIElementSelection(); } - // 显示拖拽手柄 - ShowResizeHandles(); + // 根据元素类型显示不同的工具栏 + if (element is Image) + { + ShowImageToolbar(); + } + else + { + // 对于其他UI元素,显示拖拽手柄 + ShowResizeHandles(); + } } } @@ -594,6 +613,7 @@ namespace Ink_Canvas { { selectedUIElement = null; HideResizeHandles(); + HideImageToolbar(); } private void ShowResizeHandles() @@ -613,6 +633,42 @@ namespace Ink_Canvas { } } + private void ShowImageToolbar() + { + if (selectedUIElement == null || borderImageSelectionControl == null) return; + + var bounds = GetUIElementBounds(selectedUIElement); + UpdateImageToolbarPosition(bounds); + borderImageSelectionControl.Visibility = Visibility.Visible; + } + + private void HideImageToolbar() + { + if (borderImageSelectionControl != null) + { + borderImageSelectionControl.Visibility = Visibility.Collapsed; + } + } + + private void UpdateImageToolbarPosition(Rect bounds) + { + if (borderImageSelectionControl == null) return; + + // 计算工具栏位置,类似于墨迹选择工具栏的逻辑 + var toolbarX = bounds.X + bounds.Width / 2 - BorderImageSelectionControlWidth / 2; + var toolbarY = bounds.Y + bounds.Height + 10; // 在图片下方10像素处 + + // 确保工具栏不会超出画布边界 + if (toolbarX < 0) toolbarX = 0; + if (toolbarX + BorderImageSelectionControlWidth > inkCanvas.ActualWidth) + toolbarX = inkCanvas.ActualWidth - BorderImageSelectionControlWidth; + + if (toolbarY + BorderImageSelectionControlHeight > inkCanvas.ActualHeight) + toolbarY = bounds.Y - BorderImageSelectionControlHeight - 10; // 如果下方空间不够,显示在上方 + + borderImageSelectionControl.Margin = new Thickness(toolbarX, toolbarY, 0, 0); + } + private Rect GetUIElementBounds(UIElement element) { var left = InkCanvas.GetLeft(element); @@ -824,6 +880,8 @@ namespace Ink_Canvas { } } + + #endregion } } \ No newline at end of file