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