From 5fdbf83f326898b14ee2b38d66ad6a88f1d8bcb4 Mon Sep 17 00:00:00 2001 From: PrefacedCorg <1876568293@qq.com> Date: Thu, 31 Jul 2025 13:23:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9B=BE=E7=89=87=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 85 ++++++++-- Ink Canvas/MainWindow.xaml.cs | 46 ++++++ .../MainWindow_cs/MW_ElementsControls.cs | 147 ++++++++++++++++++ .../MainWindow_cs/MW_SelectionGestures.cs | 5 +- 4 files changed, 269 insertions(+), 14 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 19b38b3f..2a0eca63 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -3159,33 +3159,94 @@ HorizontalAlignment="Left" VerticalAlignment="Top" Margin="800,900,0,0" CornerRadius="5" Height="80" Background="{DynamicResource FloatBarBackground}" - Visibility="Collapsed" + Visibility="{Binding ElementName=GridInkCanvasSelectionCover, Path=Visibility}" BorderThickness="1" BorderBrush="{DynamicResource FloatBarBorderBrush}"> - + Width="40" MouseDown="Border_MouseDown" MouseUp="BorderImageClone_MouseUp"> - - - - - - + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index 1d6fc062..afb7fc8b 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -1521,8 +1521,30 @@ namespace Ink_Canvas { #region Image Toolbar Event Handlers + private void BorderImageClone_MouseUp(object sender, MouseButtonEventArgs e) + { + if (lastBorderMouseDownObject != sender) return; + + if (selectedUIElement is Image image) + { + CloneImage(image); + } + } + + private void BorderImageCloneToNewBoard_MouseUp(object sender, MouseButtonEventArgs e) + { + if (lastBorderMouseDownObject != sender) return; + + if (selectedUIElement is Image image) + { + CloneImageToNewBoard(image); + } + } + private void BorderImageRotateLeft_MouseUp(object sender, MouseButtonEventArgs e) { + if (lastBorderMouseDownObject != sender) return; + if (selectedUIElement is Image image) { RotateImage(image, -90); @@ -1531,14 +1553,38 @@ namespace Ink_Canvas { private void BorderImageRotateRight_MouseUp(object sender, MouseButtonEventArgs e) { + if (lastBorderMouseDownObject != sender) return; + if (selectedUIElement is Image image) { RotateImage(image, 90); } } + private void GridImageScaleIncrease_MouseUp(object sender, MouseButtonEventArgs e) + { + if (lastBorderMouseDownObject != sender) return; + + if (selectedUIElement is Image image) + { + ScaleImage(image, 1.25); // 放大5% + } + } + + private void GridImageScaleDecrease_MouseUp(object sender, MouseButtonEventArgs e) + { + if (lastBorderMouseDownObject != sender) return; + + if (selectedUIElement is Image image) + { + ScaleImage(image, 0.8); // 缩小5% + } + } + private void BorderImageDelete_MouseUp(object sender, MouseButtonEventArgs e) { + if (lastBorderMouseDownObject != sender) return; + if (selectedUIElement is Image image) { DeleteImage(image); diff --git a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs index 05ed4932..1591aa7f 100644 --- a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs +++ b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs @@ -3,6 +3,7 @@ using System.IO; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; +using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using Ink_Canvas.Helpers; @@ -219,6 +220,152 @@ namespace Ink_Canvas } } + /// + /// 克隆图片 + /// + /// 要克隆的图片 + private void CloneImage(Image image) + { + if (image == null) return; + + try + { + // 创建图片的副本 + var clonedImage = new Image + { + Source = image.Source, + Width = image.Width, + Height = image.Height, + Stretch = image.Stretch, + RenderTransform = image.RenderTransform?.Clone() as Transform + }; + + // 设置位置,稍微偏移以避免重叠 + InkCanvas.SetLeft(clonedImage, InkCanvas.GetLeft(image) + 20); + InkCanvas.SetTop(clonedImage, InkCanvas.GetTop(image) + 20); + + // 添加鼠标事件处理,使图片可以被选择 + clonedImage.MouseDown += UIElement_MouseDown; + clonedImage.IsManipulationEnabled = true; + + // 添加到画布 + inkCanvas.Children.Add(clonedImage); + + // 选择新克隆的图片 + DeselectUIElement(); + SelectUIElement(clonedImage); + + // 提交到时间机器以支持撤销 + timeMachine.CommitElementInsertHistory(clonedImage); + } + catch (Exception ex) + { + // 记录错误但不中断程序 + System.Diagnostics.Debug.WriteLine($"克隆图片时发生错误: {ex.Message}"); + } + } + + /// + /// 克隆图片到新页面 + /// + /// 要克隆的图片 + private void CloneImageToNewBoard(Image image) + { + if (image == null) return; + + try + { + // 创建图片的副本 + var clonedImage = new Image + { + Source = image.Source, + Width = image.Width, + Height = image.Height, + Stretch = image.Stretch, + RenderTransform = image.RenderTransform?.Clone() as Transform + }; + + // 设置位置,稍微偏移以避免重叠 + InkCanvas.SetLeft(clonedImage, InkCanvas.GetLeft(image) + 20); + InkCanvas.SetTop(clonedImage, InkCanvas.GetTop(image) + 20); + + // 添加鼠标事件处理,使图片可以被选择 + clonedImage.MouseDown += UIElement_MouseDown; + clonedImage.IsManipulationEnabled = true; + + // 创建新页面 + BtnWhiteBoardAdd_Click(null, null); + + // 添加到新页面的画布 + inkCanvas.Children.Add(clonedImage); + + // 选择新克隆的图片 + DeselectUIElement(); + SelectUIElement(clonedImage); + + // 提交到时间机器以支持撤销 + timeMachine.CommitElementInsertHistory(clonedImage); + } + catch (Exception ex) + { + // 记录错误但不中断程序 + System.Diagnostics.Debug.WriteLine($"克隆图片到新页面时发生错误: {ex.Message}"); + } + } + + /// + /// 缩放图片 + /// + /// 要缩放的图片 + /// 缩放因子(大于1为放大,小于1为缩小) + private void ScaleImage(Image image, double scaleFactor) + { + if (image == null) return; + + try + { + // 获取当前的变换 + var transformGroup = image.RenderTransform as TransformGroup ?? new TransformGroup(); + + // 查找现有的缩放变换 + ScaleTransform scaleTransform = null; + foreach (Transform transform in transformGroup.Children) + { + if (transform is ScaleTransform st) + { + scaleTransform = st; + break; + } + } + + // 如果没有缩放变换,创建一个新的 + if (scaleTransform == null) + { + scaleTransform = new ScaleTransform(); + transformGroup.Children.Add(scaleTransform); + } + + // 设置缩放中心为图片中心 + scaleTransform.CenterX = image.ActualWidth / 2; + scaleTransform.CenterY = image.ActualHeight / 2; + + // 应用缩放因子 + scaleTransform.ScaleX *= scaleFactor; + scaleTransform.ScaleY *= scaleFactor; + + // 应用变换 + image.RenderTransform = transformGroup; + + // 提交到时间机器以支持撤销 + // 注意:缩放操作目前不支持撤销,因为需要更复杂的历史记录机制 + } + catch (Exception ex) + { + // 记录错误但不中断程序 + System.Diagnostics.Debug.WriteLine($"缩放图片时发生错误: {ex.Message}"); + } + } + /// /// 删除图片 /// diff --git a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs index 191c0cb9..d9b86693 100644 --- a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs +++ b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs @@ -166,6 +166,7 @@ namespace Ink_Canvas { } } +// ... existing code ... private void ImageRotate45_MouseUp(object sender, MouseButtonEventArgs e) { if (lastBorderMouseDownObject != sender) return; @@ -179,7 +180,7 @@ namespace Ink_Canvas { center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点 // Update matrix to reflect translation/rotation - m.RotateAt(45, center.X, center.Y); // 旋转 + m.RotateAt(45, center.X, center.Y); // 顺时针旋转45度 var targetStrokes = inkCanvas.GetSelectedStrokes(); foreach (var stroke in targetStrokes) stroke.Transform(m, false); @@ -471,7 +472,7 @@ namespace Ink_Canvas { // 图片工具栏相关 private Border borderImageSelectionControl; - private double BorderImageSelectionControlWidth = 150.0; // 3个按钮 + 分隔线的实际宽度 + private double BorderImageSelectionControlWidth = 490.0; // 6个按钮 + 分隔线的实际宽度 private double BorderImageSelectionControlHeight = 80.0; // 元素变化监听相关