From 9e511d29a604ae35c869e45c52fe936d8623af7f Mon Sep 17 00:00:00 2001
From: CJKmkp <2564608840@qq.com>
Date: Sat, 30 Aug 2025 21:18:34 +0800
Subject: [PATCH] =?UTF-8?q?delete:=E5=9B=BE=E7=89=87=E6=8F=92=E5=85=A5?=
=?UTF-8?q?=E9=80=89=E4=B8=AD=E5=92=8C=E7=A7=BB=E5=8A=A8=E7=9B=B8=E5=85=B3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Ink Canvas/MainWindow.xaml | 107 +---
Ink Canvas/MainWindow.xaml.cs | 88 +--
Ink Canvas/MainWindow_cs/MW_BoardControls.cs | 21 +-
.../MainWindow_cs/MW_ClipboardHandler.cs | 4 -
.../MainWindow_cs/MW_ElementsControls.cs | 27 -
.../MainWindow_cs/MW_FloatingBarIcons.cs | 16 -
Ink Canvas/MainWindow_cs/MW_ImageInsert.cs | 4 -
Ink Canvas/MainWindow_cs/MW_PageListView.cs | 6 -
.../MainWindow_cs/MW_SelectionGestures.cs | 536 +-----------------
Ink Canvas/MainWindow_cs/MW_TimeMachine.cs | 8 -
10 files changed, 34 insertions(+), 783 deletions(-)
diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml
index 1a087381..dc8c2a44 100644
--- a/Ink Canvas/MainWindow.xaml
+++ b/Ink Canvas/MainWindow.xaml
@@ -3443,112 +3443,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs
index 33c4260e..f31390d8 100644
--- a/Ink Canvas/MainWindow.xaml.cs
+++ b/Ink Canvas/MainWindow.xaml.cs
@@ -509,7 +509,7 @@ namespace Ink_Canvas
ApplyAlwaysOnTop();
// 初始化UIElement选择系统
- InitializeUIElementSelection();
+
// 初始化剪贴板监控
InitializeClipboardMonitoring();
@@ -1003,19 +1003,7 @@ namespace Ink_Canvas
// 如果点击的不是图片或其他UI元素,则取消选择
if (!(hitTest is Image) && !(hitTest is MediaElement))
{
- // 检查是否点击在已选择的UI元素上
- bool clickedOnSelectedElement = false;
- if (selectedUIElement != null)
- {
- var elementBounds = GetUIElementBounds(selectedUIElement);
- var clickPoint = e.GetPosition(inkCanvas);
- clickedOnSelectedElement = elementBounds.Contains(clickPoint);
- }
-
- if (!clickedOnSelectedElement)
- {
- DeselectUIElement();
- }
+
}
}
}
@@ -1931,79 +1919,7 @@ 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);
- }
- }
-
- 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);
- }
- }
-
- private void GridImageScaleDecrease_MouseUp(object sender, MouseButtonEventArgs e)
- {
- if (lastBorderMouseDownObject != sender) return;
-
- if (selectedUIElement is Image image)
- {
- ScaleImage(image, 0.8);
- }
- }
-
- private void BorderImageDelete_MouseUp(object sender, MouseButtonEventArgs e)
- {
- if (lastBorderMouseDownObject != sender) return;
-
- if (selectedUIElement is Image image)
- {
- DeleteImage(image);
- }
- }
-
- #endregion
#region 全局快捷键管理
///
diff --git a/Ink Canvas/MainWindow_cs/MW_BoardControls.cs b/Ink Canvas/MainWindow_cs/MW_BoardControls.cs
index f011d0c8..8ecc3345 100644
--- a/Ink Canvas/MainWindow_cs/MW_BoardControls.cs
+++ b/Ink Canvas/MainWindow_cs/MW_BoardControls.cs
@@ -116,8 +116,7 @@ namespace Ink_Canvas
_currentCommitType = CommitReason.ClearingCanvas;
if (isErasedByCode) _currentCommitType = CommitReason.CodeInput;
- // 取消任何UI元素的选择,隐藏拉伸控件
- DeselectUIElement();
+
// 只清除笔画,不清除图片元素
// 图片元素的清除由调用方决定
@@ -159,11 +158,7 @@ namespace Ink_Canvas
foreach (var item in TimeMachineHistories[CurrentWhiteboardIndex]) ApplyHistoryToCanvas(item);
}
- // 确保选中状态被清除,因为我们切换了页面
- if (selectedUIElement != null)
- {
- DeselectUIElement();
- }
+
}
catch
{
@@ -214,8 +209,7 @@ namespace Ink_Canvas
{
if (CurrentWhiteboardIndex <= 1) return;
- // 取消任何UI元素的选择
- DeselectUIElement();
+
SaveStrokes();
@@ -239,9 +233,7 @@ namespace Ink_Canvas
BtnWhiteBoardAdd_Click(sender, e);
return;
}
-
- // 取消任何UI元素的选择
- DeselectUIElement();
+
SaveStrokes();
@@ -258,10 +250,7 @@ namespace Ink_Canvas
if (WhiteboardTotalCount >= 99) return;
if (Settings.Automation.IsAutoSaveStrokesAtClear &&
inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) SaveScreenShot(true);
-
- // 取消任何UI元素的选择
- DeselectUIElement();
-
+
SaveStrokes();
ClearStrokes(true);
diff --git a/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs b/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs
index ee4a6152..6a136cd3 100644
--- a/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs
+++ b/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs
@@ -145,10 +145,6 @@ namespace Ink_Canvas
// 添加到画布
inkCanvas.Children.Add(image);
- // 添加鼠标事件处理
- image.MouseDown += UIElement_MouseDown;
- image.IsManipulationEnabled = true;
-
// 提交到历史记录
timeMachine.CommitElementInsertHistory(image);
diff --git a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs
index ea0176cc..058ab986 100644
--- a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs
+++ b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs
@@ -31,10 +31,6 @@ namespace Ink_Canvas
CenterAndScaleElement(image);
inkCanvas.Children.Add(image);
- // 添加鼠标事件处理,使图片可以被选择
- image.MouseDown += UIElement_MouseDown;
- image.IsManipulationEnabled = true;
-
timeMachine.CommitElementInsertHistory(image);
}
}
@@ -115,10 +111,6 @@ namespace Ink_Canvas
InkCanvas.SetTop(mediaElement, 0);
inkCanvas.Children.Add(mediaElement);
- // 添加鼠标事件处理,使媒体元素可以被选择
- mediaElement.MouseDown += UIElement_MouseDown;
- mediaElement.IsManipulationEnabled = true;
-
mediaElement.LoadedBehavior = MediaState.Manual;
mediaElement.UnloadedBehavior = MediaState.Manual;
mediaElement.Loaded += async (_, args) =>
@@ -242,17 +234,9 @@ namespace Ink_Canvas
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);
}
@@ -287,20 +271,12 @@ namespace Ink_Canvas
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);
}
@@ -379,9 +355,6 @@ namespace Ink_Canvas
{
inkCanvas.Children.Remove(image);
- // 取消选择
- DeselectUIElement();
-
// 提交到时间机器以支持撤销
timeMachine.CommitElementRemoveHistory(image);
}
diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs
index ae4e514e..a3ba95ea 100644
--- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs
+++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs
@@ -2500,8 +2500,6 @@ namespace Ink_Canvas
AnimationsHelper.HideWithSlideAndFade(BlackboardCenterSide);
AnimationsHelper.HideWithSlideAndFade(BlackboardRightSide);
- DeselectUIElement();
-
// 在PPT模式下隐藏手势面板和手势按钮
AnimationsHelper.HideWithSlideAndFade(TwoFingerGestureBorder);
AnimationsHelper.HideWithSlideAndFade(BoardTwoFingerGestureBorder);
@@ -2549,9 +2547,6 @@ namespace Ink_Canvas
AnimationsHelper.HideWithSlideAndFade(BlackboardCenterSide);
AnimationsHelper.HideWithSlideAndFade(BlackboardRightSide);
- // 取消任何UI元素的选择
- DeselectUIElement();
-
// 在PPT模式下隐藏手势面板和手势按钮
AnimationsHelper.HideWithSlideAndFade(TwoFingerGestureBorder);
AnimationsHelper.HideWithSlideAndFade(BoardTwoFingerGestureBorder);
@@ -2592,9 +2587,6 @@ namespace Ink_Canvas
AnimationsHelper.ShowWithSlideFromBottomAndFade(BlackboardCenterSide);
AnimationsHelper.ShowWithSlideFromBottomAndFade(BlackboardRightSide);
- // 取消任何UI元素的选择
- DeselectUIElement();
-
SaveStrokes(true);
ClearStrokes(true);
@@ -2831,10 +2823,6 @@ namespace Ink_Canvas
CenterAndScaleElement(image);
inkCanvas.Children.Add(image);
- // 添加鼠标事件处理,使图片可以被选择
- image.MouseDown += UIElement_MouseDown;
- image.IsManipulationEnabled = true;
-
timeMachine.CommitElementInsertHistory(image);
}
}
@@ -2859,10 +2847,6 @@ namespace Ink_Canvas
CenterAndScaleElement(image);
inkCanvas.Children.Add(image);
- // 添加鼠标事件处理,使图片可以被选择
- image.MouseDown += UIElement_MouseDown;
- image.IsManipulationEnabled = true;
-
timeMachine.CommitElementInsertHistory(image);
}
}
diff --git a/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs b/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs
index 9a0b08d3..fdaa10b0 100644
--- a/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs
+++ b/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs
@@ -188,10 +188,6 @@ namespace Ink_Canvas
// 添加到画布
inkCanvas.Children.Add(image);
- // 添加鼠标事件处理,使图片可以被选择
- image.MouseDown += UIElement_MouseDown;
- image.IsManipulationEnabled = true;
-
// 提交历史记录
timeMachine.CommitElementInsertHistory(image);
diff --git a/Ink Canvas/MainWindow_cs/MW_PageListView.cs b/Ink Canvas/MainWindow_cs/MW_PageListView.cs
index 70521c1d..c82a0113 100644
--- a/Ink Canvas/MainWindow_cs/MW_PageListView.cs
+++ b/Ink Canvas/MainWindow_cs/MW_PageListView.cs
@@ -86,9 +86,6 @@ namespace Ink_Canvas
// 只有当选择的页面与当前页面不同时才进行切换
if (index + 1 != CurrentWhiteboardIndex)
{
- // 取消任何UI元素的选择(只在真正切换页面时)
- DeselectUIElement();
-
SaveStrokes();
ClearStrokes(true);
CurrentWhiteboardIndex = index + 1;
@@ -111,9 +108,6 @@ namespace Ink_Canvas
// 只有当选择的页面与当前页面不同时才进行切换
if (index + 1 != CurrentWhiteboardIndex)
{
- // 取消任何UI元素的选择(只在真正切换页面时)
- DeselectUIElement();
-
SaveStrokes();
ClearStrokes(true);
CurrentWhiteboardIndex = index + 1;
diff --git a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs
index a87dec7b..346bbde6 100644
--- a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs
+++ b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs
@@ -29,6 +29,7 @@ namespace Ink_Canvas
return;
}
}
+
lastBorderMouseDownObject = sender;
}
@@ -93,6 +94,7 @@ namespace Ink_Canvas
stroke.DrawingAttributes.Width = newWidth;
stroke.DrawingAttributes.Height = newHeight;
}
+
if (DrawingAttributesHistory.Count > 0)
{
@@ -240,6 +242,7 @@ namespace Ink_Canvas
{
collecion.Add(item.Key);
}
+
timeMachine.CommitStrokeDrawingAttributesHistory(DrawingAttributesHistory);
DrawingAttributesHistory = new Dictionary>();
foreach (var item in DrawingAttributesHistoryFlag)
@@ -277,9 +280,8 @@ namespace Ink_Canvas
if (inkCanvas.GetSelectedStrokes().Count == inkCanvas.Strokes.Count)
{
// 使用集中化的工具模式切换方法
- SetCurrentToolMode(InkCanvasEditingMode.Ink, () => {
- SetCurrentToolMode(InkCanvasEditingMode.Select);
- });
+ SetCurrentToolMode(InkCanvasEditingMode.Ink,
+ () => { SetCurrentToolMode(InkCanvasEditingMode.Select); });
}
else
{
@@ -307,8 +309,7 @@ namespace Ink_Canvas
if (inkCanvas.GetSelectedStrokes().Count == 0)
{
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
- // 当没有选中笔画时,检查是否有选中的UIElement
- CheckUIElementSelection();
+
}
else
{
@@ -316,25 +317,11 @@ namespace Ink_Canvas
BorderStrokeSelectionClone.Background = Brushes.Transparent;
isStrokeSelectionCloneOn = false;
updateBorderStrokeSelectionControlLocation();
- // 当选中笔画时,取消UIElement选择
- DeselectUIElement();
+
}
}
- private void CheckUIElementSelection()
- {
- // 检查InkCanvas中的UIElement是否被选中
- var selectedElements = inkCanvas.GetSelectedElements();
- if (selectedElements.Count > 0)
- {
- var element = selectedElements[0];
- SelectUIElement(element);
- }
- else
- {
- DeselectUIElement();
- }
- }
+
private void updateBorderStrokeSelectionControlLocation()
{
@@ -366,8 +353,10 @@ namespace Ink_Canvas
{
StrokeInitialHistory[item.Key] = item.Value.Item2;
}
+
StrokeManipulationHistory = null;
}
+
if (DrawingAttributesHistory.Count > 0)
{
timeMachine.CommitStrokeDrawingAttributesHistory(DrawingAttributesHistory);
@@ -419,18 +408,26 @@ namespace Ink_Canvas
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
}
- catch { }
+ catch
+ {
+ }
}
updateBorderStrokeSelectionControlLocation();
}
}
- catch { }
+ catch
+ {
+ }
}
- private void GridInkCanvasSelectionCover_TouchDown(object sender, TouchEventArgs e) { }
+ private void GridInkCanvasSelectionCover_TouchDown(object sender, TouchEventArgs e)
+ {
+ }
- private void GridInkCanvasSelectionCover_TouchUp(object sender, TouchEventArgs e) { }
+ private void GridInkCanvasSelectionCover_TouchUp(object sender, TouchEventArgs e)
+ {
+ }
private Point lastTouchPointOnGridInkCanvasCover = new Point(0, 0);
@@ -514,225 +511,7 @@ namespace Ink_Canvas
}
#region UIElement Selection and Resize
-
- private UIElement selectedUIElement;
- private System.Windows.Controls.Canvas resizeHandlesCanvas;
- private readonly List resizeHandles = new List();
- private bool isResizing;
- private ResizeDirection currentResizeDirection = ResizeDirection.None;
- private Point resizeStartPoint;
- private Rect originalElementBounds;
-
- // 图片工具栏相关
- private Border borderImageSelectionControl;
- private double BorderImageSelectionControlWidth = 490.0; // 6个按钮 + 分隔线的实际宽度
- private double BorderImageSelectionControlHeight = 80.0;
-
- // 元素变化监听相关
- private DispatcherTimer elementUpdateTimer;
- private Rect lastElementBounds;
-
- private enum ResizeDirection
- {
- None,
- TopLeft,
- TopCenter,
- TopRight,
- MiddleLeft,
- MiddleRight,
- BottomLeft,
- BottomCenter,
- BottomRight
- }
-
- private void InitializeUIElementSelection()
- {
- // 创建拖拽手柄画布
- if (resizeHandlesCanvas == null)
- {
- resizeHandlesCanvas = new System.Windows.Controls.Canvas
- {
- Background = Brushes.Transparent,
- IsHitTestVisible = true,
- Visibility = Visibility.Collapsed
- };
-
- // 将手柄画布添加到主网格中,确保它在InkCanvas之上
- var mainGrid = inkCanvas.Parent as Grid;
- if (mainGrid != null)
- {
- mainGrid.Children.Add(resizeHandlesCanvas);
- Panel.SetZIndex(resizeHandlesCanvas, 1000); // 确保在最上层
- }
- }
-
- // 初始化图片工具栏引用
- if (borderImageSelectionControl == null)
- {
- borderImageSelectionControl = FindName("BorderImageSelectionControl") as Border;
- }
-
- // 创建8个拖拽手柄
- CreateResizeHandles();
- }
-
- private void CreateResizeHandles()
- {
- resizeHandles.Clear();
- resizeHandlesCanvas.Children.Clear();
-
- var directions = new[]
- {
- ResizeDirection.TopLeft, ResizeDirection.TopCenter, ResizeDirection.TopRight,
- ResizeDirection.MiddleLeft, ResizeDirection.MiddleRight,
- ResizeDirection.BottomLeft, ResizeDirection.BottomCenter, ResizeDirection.BottomRight
- };
-
- foreach (var direction in directions)
- {
- var handle = new Rectangle
- {
- Width = 12,
- Height = 12,
- Fill = Brushes.White,
- Stroke = Brushes.DodgerBlue,
- StrokeThickness = 2,
- Cursor = GetCursorForDirection(direction),
- Tag = direction
- };
-
- handle.MouseDown += ResizeHandle_MouseDown;
- handle.MouseMove += ResizeHandle_MouseMove;
- handle.MouseUp += ResizeHandle_MouseUp;
-
- resizeHandles.Add(handle);
- resizeHandlesCanvas.Children.Add(handle);
- }
- }
-
- private Cursor GetCursorForDirection(ResizeDirection direction)
- {
- switch (direction)
- {
- case ResizeDirection.TopLeft:
- case ResizeDirection.BottomRight:
- return Cursors.SizeNWSE;
- case ResizeDirection.TopRight:
- case ResizeDirection.BottomLeft:
- return Cursors.SizeNESW;
- case ResizeDirection.TopCenter:
- case ResizeDirection.BottomCenter:
- return Cursors.SizeNS;
- case ResizeDirection.MiddleLeft:
- case ResizeDirection.MiddleRight:
- return Cursors.SizeWE;
- default:
- return Cursors.Arrow;
- }
- }
-
- private void SelectUIElement(UIElement element)
- {
- if (selectedUIElement == element) return;
-
- // 取消之前的选择
- DeselectUIElement();
-
- // 清除笔画选择
- if (inkCanvas.GetSelectedStrokes().Count > 0)
- {
- isProgramChangeStrokeSelection = true;
- inkCanvas.Select(new StrokeCollection());
- isProgramChangeStrokeSelection = false;
- }
-
- selectedUIElement = element;
-
- if (element != null)
- {
- // 初始化选择系统(如果还没有初始化)
- if (resizeHandlesCanvas == null)
- {
- InitializeUIElementSelection();
- }
-
- // 显示拖拽手柄(所有UI元素都需要)
- ShowResizeHandles();
-
- // 根据元素类型显示特定的工具栏
- if (element is Image)
- {
- ShowImageToolbar();
- }
-
- // 监听元素的布局变化,以便实时更新手柄位置
- StartMonitoringElementChanges(element);
- }
- }
-
- private void DeselectUIElement()
- {
- // 停止监听之前选中元素的变化
- StopMonitoringElementChanges();
-
- selectedUIElement = null;
- HideResizeHandles();
- HideImageToolbar();
- }
-
- private void ShowResizeHandles()
- {
- if (selectedUIElement == null || resizeHandlesCanvas == null) return;
-
- var bounds = GetUIElementBounds(selectedUIElement);
- UpdateResizeHandlesPosition(bounds);
- resizeHandlesCanvas.Visibility = Visibility.Visible;
- }
-
- private void HideResizeHandles()
- {
- if (resizeHandlesCanvas != null)
- {
- resizeHandlesCanvas.Visibility = Visibility.Collapsed;
- }
- }
-
- 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)
{
if (element is FrameworkElement fe)
@@ -772,270 +551,7 @@ namespace Ink_Canvas
return new Rect(0, 0, 0, 0);
}
-
- private void UpdateResizeHandlesPosition(Rect bounds)
- {
- if (resizeHandles.Count != 8) return;
-
- var handleSize = 12.0;
- var halfHandle = handleSize / 2;
-
- // 计算手柄位置
- var positions = new[]
- {
- new Point(bounds.Left - halfHandle, bounds.Top - halfHandle), // TopLeft
- new Point(bounds.Left + bounds.Width / 2 - halfHandle, bounds.Top - halfHandle), // TopCenter
- new Point(bounds.Right - halfHandle, bounds.Top - halfHandle), // TopRight
- new Point(bounds.Left - halfHandle, bounds.Top + bounds.Height / 2 - halfHandle), // MiddleLeft
- new Point(bounds.Right - halfHandle, bounds.Top + bounds.Height / 2 - halfHandle), // MiddleRight
- new Point(bounds.Left - halfHandle, bounds.Bottom - halfHandle), // BottomLeft
- new Point(bounds.Left + bounds.Width / 2 - halfHandle, bounds.Bottom - halfHandle), // BottomCenter
- new Point(bounds.Right - halfHandle, bounds.Bottom - halfHandle) // BottomRight
- };
-
- for (int i = 0; i < resizeHandles.Count && i < positions.Length; i++)
- {
- System.Windows.Controls.Canvas.SetLeft(resizeHandles[i], positions[i].X);
- System.Windows.Controls.Canvas.SetTop(resizeHandles[i], positions[i].Y);
- }
- }
-
- private void ResizeHandle_MouseDown(object sender, MouseButtonEventArgs e)
- {
- if (selectedUIElement == null) return;
-
- var handle = sender as Rectangle;
- if (handle?.Tag is ResizeDirection direction)
- {
- isResizing = true;
- currentResizeDirection = direction;
- resizeStartPoint = e.GetPosition(inkCanvas);
- originalElementBounds = GetUIElementBounds(selectedUIElement);
-
- handle.CaptureMouse();
- e.Handled = true;
- }
- }
-
- private void ResizeHandle_MouseMove(object sender, MouseEventArgs e)
- {
- if (!isResizing || selectedUIElement == null) return;
-
- var currentPoint = e.GetPosition(inkCanvas);
- var deltaX = currentPoint.X - resizeStartPoint.X;
- var deltaY = currentPoint.Y - resizeStartPoint.Y;
-
- ResizeUIElement(deltaX, deltaY);
- e.Handled = true;
- }
-
- private void ResizeHandle_MouseUp(object sender, MouseButtonEventArgs e)
- {
- if (isResizing)
- {
- isResizing = false;
- currentResizeDirection = ResizeDirection.None;
-
- var handle = sender as Rectangle;
- handle?.ReleaseMouseCapture();
- e.Handled = true;
- }
- }
-
- private void ResizeUIElement(double deltaX, double deltaY)
- {
- if (selectedUIElement == null) return;
-
- var newBounds = originalElementBounds;
- const double minSize = 20.0;
-
- switch (currentResizeDirection)
- {
- case ResizeDirection.TopLeft:
- var newWidth = originalElementBounds.Width - deltaX;
- var newHeight = originalElementBounds.Height - deltaY;
- if (newWidth >= minSize && newHeight >= minSize)
- {
- newBounds.X = originalElementBounds.X + deltaX;
- newBounds.Y = originalElementBounds.Y + deltaY;
- newBounds.Width = newWidth;
- newBounds.Height = newHeight;
- }
- break;
-
- case ResizeDirection.TopCenter:
- var newHeightTC = originalElementBounds.Height - deltaY;
- if (newHeightTC >= minSize)
- {
- newBounds.Y = originalElementBounds.Y + deltaY;
- newBounds.Height = newHeightTC;
- }
- break;
-
- case ResizeDirection.TopRight:
- var newWidthTR = originalElementBounds.Width + deltaX;
- var newHeightTR = originalElementBounds.Height - deltaY;
- if (newWidthTR >= minSize && newHeightTR >= minSize)
- {
- newBounds.Y = originalElementBounds.Y + deltaY;
- newBounds.Width = newWidthTR;
- newBounds.Height = newHeightTR;
- }
- break;
-
- case ResizeDirection.MiddleLeft:
- var newWidthML = originalElementBounds.Width - deltaX;
- if (newWidthML >= minSize)
- {
- newBounds.X = originalElementBounds.X + deltaX;
- newBounds.Width = newWidthML;
- }
- break;
-
- case ResizeDirection.MiddleRight:
- var newWidthMR = originalElementBounds.Width + deltaX;
- if (newWidthMR >= minSize)
- {
- newBounds.Width = newWidthMR;
- }
- break;
-
- case ResizeDirection.BottomLeft:
- var newWidthBL = originalElementBounds.Width - deltaX;
- var newHeightBL = originalElementBounds.Height + deltaY;
- if (newWidthBL >= minSize && newHeightBL >= minSize)
- {
- newBounds.X = originalElementBounds.X + deltaX;
- newBounds.Width = newWidthBL;
- newBounds.Height = newHeightBL;
- }
- break;
-
- case ResizeDirection.BottomCenter:
- var newHeightBC = originalElementBounds.Height + deltaY;
- if (newHeightBC >= minSize)
- {
- newBounds.Height = newHeightBC;
- }
- break;
-
- case ResizeDirection.BottomRight:
- var newWidthBR = originalElementBounds.Width + deltaX;
- var newHeightBR = originalElementBounds.Height + deltaY;
- if (newWidthBR >= minSize && newHeightBR >= minSize)
- {
- newBounds.Width = newWidthBR;
- newBounds.Height = newHeightBR;
- }
- break;
- }
-
- // 应用新的尺寸和位置
- ApplyUIElementBounds(selectedUIElement, newBounds);
-
- // 更新手柄位置
- UpdateResizeHandlesPosition(newBounds);
-
- // 如果是图片,也更新工具栏位置
- if (selectedUIElement is Image)
- {
- UpdateImageToolbarPosition(newBounds);
- }
- }
-
- private void ApplyUIElementBounds(UIElement element, Rect bounds)
- {
- if (element is FrameworkElement fe)
- {
- // 清除RenderTransform,避免与直接设置Width/Height冲突
- fe.RenderTransform = Transform.Identity;
-
- // 直接设置位置和大小
- InkCanvas.SetLeft(element, bounds.X);
- InkCanvas.SetTop(element, bounds.Y);
- fe.Width = bounds.Width;
- fe.Height = bounds.Height;
- }
- }
-
- private void UIElement_MouseDown(object sender, MouseButtonEventArgs e)
- {
- if (inkCanvas.EditingMode == InkCanvasEditingMode.Select)
- {
- var element = sender as UIElement;
- if (element != null)
- {
- // 切换到选择模式并选择这个元素
- inkCanvas.Select(new[] { element });
- SelectUIElement(element);
- e.Handled = true;
- }
- }
- }
-
- private void StartMonitoringElementChanges(UIElement element)
- {
- // 停止之前的监听
- StopMonitoringElementChanges();
-
- if (element == null) return;
-
- // 记录初始边界
- lastElementBounds = GetUIElementBounds(element);
-
- // 创建定时器,定期检查元素边界变化
- elementUpdateTimer = new DispatcherTimer
- {
- Interval = TimeSpan.FromMilliseconds(16) // 约60FPS的更新频率
- };
-
- elementUpdateTimer.Tick += (sender, e) =>
- {
- if (selectedUIElement == null)
- {
- StopMonitoringElementChanges();
- return;
- }
-
- var currentBounds = GetUIElementBounds(selectedUIElement);
-
- // 检查边界是否发生变化
- if (!AreRectsEqual(lastElementBounds, currentBounds))
- {
- lastElementBounds = currentBounds;
-
- // 更新手柄位置
- UpdateResizeHandlesPosition(currentBounds);
-
- // 如果是图片,也更新工具栏位置
- if (selectedUIElement is Image)
- {
- UpdateImageToolbarPosition(currentBounds);
- }
- }
- };
-
- elementUpdateTimer.Start();
- }
-
- private void StopMonitoringElementChanges()
- {
- if (elementUpdateTimer != null)
- {
- elementUpdateTimer.Stop();
- elementUpdateTimer = null;
- }
- }
-
- private bool AreRectsEqual(Rect rect1, Rect rect2)
- {
- const double tolerance = 0.1; // 允许的误差范围
- return Math.Abs(rect1.X - rect2.X) < tolerance &&
- Math.Abs(rect1.Y - rect2.Y) < tolerance &&
- Math.Abs(rect1.Width - rect2.Width) < tolerance &&
- Math.Abs(rect1.Height - rect2.Height) < tolerance;
- }
-
- #endregion
}
-}
\ No newline at end of file
+}
+
+#endregion
diff --git a/Ink Canvas/MainWindow_cs/MW_TimeMachine.cs b/Ink Canvas/MainWindow_cs/MW_TimeMachine.cs
index cc44b98b..2d9ea05a 100644
--- a/Ink Canvas/MainWindow_cs/MW_TimeMachine.cs
+++ b/Ink Canvas/MainWindow_cs/MW_TimeMachine.cs
@@ -190,19 +190,11 @@ namespace Ink_Canvas
{
if (item.InsertedElement is Image img)
{
- img.MouseDown -= UIElement_MouseDown;
- img.MouseDown += UIElement_MouseDown;
- img.IsManipulationEnabled = true;
-
// 重新应用CenterAndScaleElement变换
CenterAndScaleElement(img);
}
else if (item.InsertedElement is MediaElement media)
{
- media.MouseDown -= UIElement_MouseDown;
- media.MouseDown += UIElement_MouseDown;
- media.IsManipulationEnabled = true;
-
// 重新应用CenterAndScaleElement变换
CenterAndScaleElement(media);
}