This commit is contained in:
2025-09-13 11:08:56 +08:00
parent 18188ef235
commit 110d050cc6
2 changed files with 118 additions and 4 deletions
+4
View File
@@ -1815,7 +1815,11 @@ namespace Ink_Canvas
// 先设为None再设回原来的模式,避免可能的事件冲突 // 先设为None再设回原来的模式,避免可能的事件冲突
inkCanvas.EditingMode = InkCanvasEditingMode.None; inkCanvas.EditingMode = InkCanvasEditingMode.None;
// 保存非笔画元素(如图片)
var preservedElements = PreserveNonStrokeElements();
inkCanvas.Children.Clear(); inkCanvas.Children.Clear();
// 恢复非笔画元素
RestoreNonStrokeElements(preservedElements);
isInMultiTouchMode = true; isInMultiTouchMode = true;
// 恢复到之前的编辑状态 // 恢复到之前的编辑状态
+114 -4
View File
@@ -8,6 +8,7 @@ using System.Windows.Controls;
using System.Windows.Ink; using System.Windows.Ink;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Threading; using System.Windows.Threading;
using Point = System.Windows.Point; using Point = System.Windows.Point;
@@ -30,7 +31,7 @@ namespace Ink_Canvas
{ {
var preservedElements = new List<UIElement>(); var preservedElements = new List<UIElement>();
// 遍历inkCanvas的所有子元素 // 遍历inkCanvas的所有子元素,创建副本而不是直接引用
for (int i = inkCanvas.Children.Count - 1; i >= 0; i--) for (int i = inkCanvas.Children.Count - 1; i >= 0; i--)
{ {
var child = inkCanvas.Children[i]; var child = inkCanvas.Children[i];
@@ -39,13 +40,118 @@ namespace Ink_Canvas
if (child is Image || child is MediaElement || if (child is Image || child is MediaElement ||
(child is Border border && border.Name != "AdvancedEraserOverlay")) (child is Border border && border.Name != "AdvancedEraserOverlay"))
{ {
preservedElements.Add(child); // 创建元素的深拷贝,避免直接引用导致的问题
var clonedElement = CloneUIElement(child);
if (clonedElement != null)
{
preservedElements.Add(clonedElement);
}
} }
} }
return preservedElements; return preservedElements;
} }
/// <summary>
/// 克隆UI元素,创建深拷贝
/// </summary>
private UIElement CloneUIElement(UIElement originalElement)
{
try
{
if (originalElement is Image originalImage)
{
var clonedImage = new Image();
// 复制图片源
if (originalImage.Source is BitmapSource bitmapSource)
{
clonedImage.Source = bitmapSource;
}
// 复制属性
clonedImage.Width = originalImage.Width;
clonedImage.Height = originalImage.Height;
clonedImage.Stretch = originalImage.Stretch;
clonedImage.StretchDirection = originalImage.StretchDirection;
clonedImage.Name = originalImage.Name;
clonedImage.IsHitTestVisible = originalImage.IsHitTestVisible;
clonedImage.Focusable = originalImage.Focusable;
clonedImage.Cursor = originalImage.Cursor;
clonedImage.IsManipulationEnabled = originalImage.IsManipulationEnabled;
// 复制位置
InkCanvas.SetLeft(clonedImage, InkCanvas.GetLeft(originalImage));
InkCanvas.SetTop(clonedImage, InkCanvas.GetTop(originalImage));
// 复制变换
if (originalImage.RenderTransform != null)
{
clonedImage.RenderTransform = originalImage.RenderTransform.Clone();
}
return clonedImage;
}
else if (originalElement is MediaElement originalMedia)
{
var clonedMedia = new MediaElement();
// 复制媒体属性
clonedMedia.Source = originalMedia.Source;
clonedMedia.Width = originalMedia.Width;
clonedMedia.Height = originalMedia.Height;
clonedMedia.Name = originalMedia.Name;
clonedMedia.IsHitTestVisible = originalMedia.IsHitTestVisible;
clonedMedia.Focusable = originalMedia.Focusable;
// 复制位置
InkCanvas.SetLeft(clonedMedia, InkCanvas.GetLeft(originalMedia));
InkCanvas.SetTop(clonedMedia, InkCanvas.GetTop(originalMedia));
// 复制变换
if (originalMedia.RenderTransform != null)
{
clonedMedia.RenderTransform = originalMedia.RenderTransform.Clone();
}
return clonedMedia;
}
else if (originalElement is Border originalBorder)
{
var clonedBorder = new Border();
// 复制边框属性
clonedBorder.Width = originalBorder.Width;
clonedBorder.Height = originalBorder.Height;
clonedBorder.Name = originalBorder.Name;
clonedBorder.IsHitTestVisible = originalBorder.IsHitTestVisible;
clonedBorder.Focusable = originalBorder.Focusable;
clonedBorder.Background = originalBorder.Background;
clonedBorder.BorderBrush = originalBorder.BorderBrush;
clonedBorder.BorderThickness = originalBorder.BorderThickness;
clonedBorder.CornerRadius = originalBorder.CornerRadius;
// 复制位置
InkCanvas.SetLeft(clonedBorder, InkCanvas.GetLeft(originalBorder));
InkCanvas.SetTop(clonedBorder, InkCanvas.GetTop(originalBorder));
// 复制变换
if (originalBorder.RenderTransform != null)
{
clonedBorder.RenderTransform = originalBorder.RenderTransform.Clone();
}
return clonedBorder;
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"克隆UI元素失败: {ex.Message}", LogHelper.LogType.Error);
}
return null;
}
/// <summary> /// <summary>
/// 恢复之前保存的非笔画元素到画布 /// 恢复之前保存的非笔画元素到画布
/// </summary> /// </summary>
@@ -55,11 +161,15 @@ namespace Ink_Canvas
foreach (var element in preservedElements) foreach (var element in preservedElements)
{ {
// 确保元素没有父容器再添加到inkCanvas try
if (element is FrameworkElement fe && fe.Parent == null)
{ {
// 由于现在使用的是克隆的元素,不需要检查Parent属性
inkCanvas.Children.Add(element); inkCanvas.Children.Add(element);
} }
catch (Exception ex)
{
LogHelper.WriteLogToFile($"恢复非笔画元素失败: {ex.Message}", LogHelper.LogType.Error);
}
} }
} }