fix:图片墨迹保存问题

This commit is contained in:
2025-07-29 17:44:15 +08:00
parent 1c1dd81474
commit 7f88d9ae27
4 changed files with 9 additions and 71 deletions
+7 -39
View File
@@ -46,14 +46,10 @@ namespace Ink_Canvas {
if (!elementsInHistory.Contains(child)) {
timeMachine.CommitElementInsertHistory(child);
missingElements++;
LogHelper.WriteLogToFile($"SaveStrokes: 补充保存遗漏的UI元素 {child.GetType().Name}", LogHelper.LogType.Trace);
}
}
}
if (missingElements > 0) {
LogHelper.WriteLogToFile($"SaveStrokes: 总共补充保存了 {missingElements} 个遗漏的UI元素", LogHelper.LogType.Trace);
}
// 确保画布上的所有墨迹都被保存
if (inkCanvas.Strokes.Count > 0) {
@@ -81,7 +77,6 @@ namespace Ink_Canvas {
if (missingStrokes.Count > 0) {
timeMachine.CommitStrokeUserInputHistory(missingStrokes);
LogHelper.WriteLogToFile($"SaveStrokes: 补充保存了 {missingStrokes.Count} 个遗漏的墨迹", LogHelper.LogType.Trace);
}
}
@@ -90,25 +85,13 @@ namespace Ink_Canvas {
TimeMachineHistories[0] = timeMachineHistory;
timeMachine.ClearStrokeHistory();
// 调试信息
var elementCount = timeMachineHistory?.Count(h => h.CommitType == TimeMachineHistoryType.ElementInsert && !h.StrokeHasBeenCleared) ?? 0;
var strokeHistoryCount = timeMachineHistory?.Count(h => h.CommitType == TimeMachineHistoryType.UserInput && !h.StrokeHasBeenCleared) ?? 0;
var currentCanvasElements = inkCanvas.Children.Count;
var currentCanvasStrokes = inkCanvas.Strokes.Count;
var selectedElement = selectedUIElement?.GetType().Name ?? "无";
LogHelper.WriteLogToFile($"SaveStrokes(备份主页面): 保存了 {elementCount} 个UI元素, {strokeHistoryCount} 个墨迹历史, 当前画布有 {currentCanvasElements} 个元素, {currentCanvasStrokes} 个墨迹, 选中元素: {selectedElement}", LogHelper.LogType.Trace);
} else {
var timeMachineHistory = timeMachine.ExportTimeMachineHistory();
TimeMachineHistories[CurrentWhiteboardIndex] = timeMachineHistory;
timeMachine.ClearStrokeHistory();
// 调试信息
var elementCount = timeMachineHistory?.Count(h => h.CommitType == TimeMachineHistoryType.ElementInsert && !h.StrokeHasBeenCleared) ?? 0;
var strokeHistoryCount = timeMachineHistory?.Count(h => h.CommitType == TimeMachineHistoryType.UserInput && !h.StrokeHasBeenCleared) ?? 0;
var currentCanvasElements = inkCanvas.Children.Count;
var currentCanvasStrokes = inkCanvas.Strokes.Count;
var selectedElement = selectedUIElement?.GetType().Name ?? "无";
LogHelper.WriteLogToFile($"SaveStrokes(页面{CurrentWhiteboardIndex}): 保存了 {elementCount} 个UI元素, {strokeHistoryCount} 个墨迹历史, 当前画布有 {currentCanvasElements} 个元素, {currentCanvasStrokes} 个墨迹, 选中元素: {selectedElement}", LogHelper.LogType.Trace);
}
}
@@ -134,26 +117,16 @@ namespace Ink_Canvas {
// 先清空当前画布的墨迹
inkCanvas.Strokes.Clear();
// 保存当前的UI元素,稍后会被ApplyHistoryToCanvas正确处理
var currentElements = new List<UIElement>();
for (int i = inkCanvas.Children.Count - 1; i >= 0; i--)
{
currentElements.Add(inkCanvas.Children[i]);
}
// 清空当前画布的所有内容(墨迹和图片)
// 这里必须清除图片,因为页面切换时需要完全重置画布状态
inkCanvas.Children.Clear();
LogHelper.WriteLogToFile($"RestoreStrokes: 清空了 {currentElements.Count} 个当前UI元素", LogHelper.LogType.Trace);
// 如果历史记录为空,直接返回(新页面或空页面)
if (TimeMachineHistories[targetIndex] == null) {
timeMachine.ClearStrokeHistory();
LogHelper.WriteLogToFile($"RestoreStrokes({(isBackupMain ? "" : $"{CurrentWhiteboardIndex}")}): 历史记录为空", LogHelper.LogType.Trace);
return;
}
var targetHistory = TimeMachineHistories[targetIndex];
var elementCount = targetHistory?.Count(h => h.CommitType == TimeMachineHistoryType.ElementInsert && !h.StrokeHasBeenCleared) ?? 0;
LogHelper.WriteLogToFile($"RestoreStrokes({(isBackupMain ? "" : $"{CurrentWhiteboardIndex}")}): 准备恢复 {elementCount} 个UI元素", LogHelper.LogType.Trace);
if (isBackupMain) {
timeMachine.ImportTimeMachineHistory(TimeMachineHistories[0]);
foreach (var item in TimeMachineHistories[0]) ApplyHistoryToCanvas(item);
@@ -163,18 +136,13 @@ namespace Ink_Canvas {
foreach (var item in TimeMachineHistories[CurrentWhiteboardIndex]) ApplyHistoryToCanvas(item);
}
// 恢复后检查实际的UI元素数量
var actualElementCount = inkCanvas.Children.Count;
LogHelper.WriteLogToFile($"RestoreStrokes({(isBackupMain ? "" : $"{CurrentWhiteboardIndex}")}): 实际恢复了 {actualElementCount} 个UI元素", LogHelper.LogType.Trace);
// 确保选中状态被清除,因为我们切换了页面
if (selectedUIElement != null) {
DeselectUIElement();
LogHelper.WriteLogToFile($"RestoreStrokes: 清除了选中状态", LogHelper.LogType.Trace);
}
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"RestoreStrokes失败: {ex.Message}", LogHelper.LogType.Error);
catch {
// ignored
}
}
@@ -40,7 +40,6 @@ namespace Ink_Canvas
image.IsManipulationEnabled = true;
timeMachine.CommitElementInsertHistory(image);
LogHelper.WriteLogToFile($"图片插入: {image.Name}, 当前画布UI元素数量: {inkCanvas.Children.Count}", LogHelper.LogType.Trace);
}
}
}
@@ -588,7 +588,6 @@ namespace Ink_Canvas {
}
selectedUIElement = element;
LogHelper.WriteLogToFile($"SelectUIElement: 设置选中元素为 {element?.GetType().Name ?? "null"}", LogHelper.LogType.Trace);
if (element != null)
{
@@ -602,13 +601,11 @@ namespace Ink_Canvas {
if (element is Image)
{
ShowImageToolbar();
LogHelper.WriteLogToFile($"SelectUIElement: 显示图片工具栏", LogHelper.LogType.Trace);
}
else
{
// 对于其他UI元素,显示拖拽手柄
ShowResizeHandles();
LogHelper.WriteLogToFile($"SelectUIElement: 显示拖拽手柄", LogHelper.LogType.Trace);
}
}
}
@@ -871,8 +868,6 @@ namespace Ink_Canvas {
private void UIElement_MouseDown(object sender, MouseButtonEventArgs e)
{
LogHelper.WriteLogToFile($"UIElement_MouseDown: 编辑模式={inkCanvas.EditingMode}, 元素类型={sender.GetType().Name}", LogHelper.LogType.Trace);
if (inkCanvas.EditingMode == InkCanvasEditingMode.Select)
{
var element = sender as UIElement;
@@ -881,14 +876,9 @@ namespace Ink_Canvas {
// 切换到选择模式并选择这个元素
inkCanvas.Select(new[] { element });
SelectUIElement(element);
LogHelper.WriteLogToFile($"UIElement_MouseDown: 选择了UI元素 {element.GetType().Name}", LogHelper.LogType.Trace);
e.Handled = true;
}
}
else
{
LogHelper.WriteLogToFile($"UIElement_MouseDown: 编辑模式不是Select,无法选择UI元素", LogHelper.LogType.Trace);
}
}
+2 -21
View File
@@ -135,29 +135,12 @@ namespace Ink_Canvas {
if (item.StrokeHasBeenCleared) {
// Undo: 移除元素
if (item.InsertedElement != null && targetCanvas.Children.Contains(item.InsertedElement)) {
if (item.InsertedElement != null && targetCanvas.Children.Contains(item.InsertedElement))
targetCanvas.Children.Remove(item.InsertedElement);
LogHelper.WriteLogToFile($"ApplyHistoryToCanvas: 移除UI元素 {item.InsertedElement.GetType().Name}", LogHelper.LogType.Trace);
}
} else {
// Redo: 添加元素
if (item.InsertedElement != null) {
// 确保元素不在画布上,如果在就先移除
if (targetCanvas.Children.Contains(item.InsertedElement)) {
targetCanvas.Children.Remove(item.InsertedElement);
LogHelper.WriteLogToFile($"ApplyHistoryToCanvas: 先移除已存在的UI元素 {item.InsertedElement.GetType().Name}", LogHelper.LogType.Trace);
}
// 确保元素没有其他父容器
if (item.InsertedElement is FrameworkElement fe && fe.Parent != null) {
if (fe.Parent is Panel parentPanel) {
parentPanel.Children.Remove(fe);
LogHelper.WriteLogToFile($"ApplyHistoryToCanvas: 从其他父容器移除UI元素 {item.InsertedElement.GetType().Name}", LogHelper.LogType.Trace);
}
}
if (item.InsertedElement != null && !targetCanvas.Children.Contains(item.InsertedElement)) {
targetCanvas.Children.Add(item.InsertedElement);
LogHelper.WriteLogToFile($"ApplyHistoryToCanvas: 添加UI元素 {item.InsertedElement.GetType().Name}", LogHelper.LogType.Trace);
// 重新绑定事件处理器(仅对主画布)
if (targetCanvas == inkCanvas) {
@@ -168,7 +151,6 @@ namespace Ink_Canvas {
// 重新应用CenterAndScaleElement变换
CenterAndScaleElement(img);
LogHelper.WriteLogToFile($"ApplyHistoryToCanvas: 重新配置图片元素 {img.Name}", LogHelper.LogType.Trace);
} else if (item.InsertedElement is MediaElement media) {
media.MouseDown -= UIElement_MouseDown;
media.MouseDown += UIElement_MouseDown;
@@ -176,7 +158,6 @@ namespace Ink_Canvas {
// 重新应用CenterAndScaleElement变换
CenterAndScaleElement(media);
LogHelper.WriteLogToFile($"ApplyHistoryToCanvas: 重新配置媒体元素 {media.Name}", LogHelper.LogType.Trace);
}
}
}