improve:白板翻页性能

This commit is contained in:
2026-02-22 12:26:43 +08:00
parent ac98a76797
commit 705f4fd155
2 changed files with 22 additions and 9 deletions
+16 -5
View File
@@ -189,6 +189,18 @@ namespace Ink_Canvas
}); });
} }
private static HashSet<UIElement> CollectRemovedElementsFromHistory(TimeMachineHistory[] history)
{
var set = new HashSet<UIElement>();
if (history == null) return set;
foreach (var h in history)
{
if (h.CommitType == TimeMachineHistoryType.ElementInsert && h.StrokeHasBeenCleared && h.InsertedElement != null)
set.Add(h.InsertedElement);
}
return set;
}
/// <summary> /// <summary>
/// 恢复指定白板页面的墨迹和元素信息 /// 恢复指定白板页面的墨迹和元素信息
/// </summary> /// </summary>
@@ -234,16 +246,15 @@ namespace Ink_Canvas
if (isBackupMain) if (isBackupMain)
{ {
timeMachine.ImportTimeMachineHistory(TimeMachineHistories[0]); timeMachine.ImportTimeMachineHistory(TimeMachineHistories[0]);
foreach (var item in TimeMachineHistories[0]) ApplyHistoryToCanvas(item); var removed0 = CollectRemovedElementsFromHistory(TimeMachineHistories[0]);
// 恢复多指书写模式状态 foreach (var item in TimeMachineHistories[0]) ApplyHistoryToCanvas(item, null, removed0);
RestoreMultiTouchModeState(0); RestoreMultiTouchModeState(0);
} }
else else
{ {
timeMachine.ImportTimeMachineHistory(TimeMachineHistories[CurrentWhiteboardIndex]); timeMachine.ImportTimeMachineHistory(TimeMachineHistories[CurrentWhiteboardIndex]);
// 通过时间机器历史恢复所有内容(墨迹和图片) var removed = CollectRemovedElementsFromHistory(TimeMachineHistories[CurrentWhiteboardIndex]);
foreach (var item in TimeMachineHistories[CurrentWhiteboardIndex]) ApplyHistoryToCanvas(item); foreach (var item in TimeMachineHistories[CurrentWhiteboardIndex]) ApplyHistoryToCanvas(item, null, removed);
// 恢复多指书写模式状态
RestoreMultiTouchModeState(CurrentWhiteboardIndex); RestoreMultiTouchModeState(CurrentWhiteboardIndex);
} }
+6 -4
View File
@@ -105,7 +105,8 @@ namespace Ink_Canvas
/// 5. Clear: 处理清除画布操作 /// 5. Clear: 处理清除画布操作
/// 6. ElementInsert: 处理元素插入操作 /// 6. ElementInsert: 处理元素插入操作
/// </remarks> /// </remarks>
private void ApplyHistoryToCanvas(TimeMachineHistory item, InkCanvas applyCanvas = null) /// <param name="elementsRemovedInThisPage"></param>
private void ApplyHistoryToCanvas(TimeMachineHistory item, InkCanvas applyCanvas = null, HashSet<UIElement> elementsRemovedInThisPage = null)
{ {
_currentCommitType = CommitReason.CodeInput; _currentCommitType = CommitReason.CodeInput;
var canvas = inkCanvas; var canvas = inkCanvas;
@@ -227,18 +228,19 @@ namespace Ink_Canvas
} }
else if (item.CommitType == TimeMachineHistoryType.ElementInsert) else if (item.CommitType == TimeMachineHistoryType.ElementInsert)
{ {
// 使用传入的canvas参数,而不是总是使用inkCanvas
var targetCanvas = canvas ?? inkCanvas; var targetCanvas = canvas ?? inkCanvas;
if (item.StrokeHasBeenCleared) if (item.StrokeHasBeenCleared)
{ {
// Undo: 移除元素 if (elementsRemovedInThisPage != null)
return;
if (item.InsertedElement != null && targetCanvas.Children.Contains(item.InsertedElement)) if (item.InsertedElement != null && targetCanvas.Children.Contains(item.InsertedElement))
targetCanvas.Children.Remove(item.InsertedElement); targetCanvas.Children.Remove(item.InsertedElement);
} }
else else
{ {
// Redo: 添加元素 if (elementsRemovedInThisPage != null && item.InsertedElement != null && elementsRemovedInThisPage.Contains(item.InsertedElement))
return;
if (item.InsertedElement != null && !targetCanvas.Children.Contains(item.InsertedElement)) if (item.InsertedElement != null && !targetCanvas.Children.Contains(item.InsertedElement))
{ {
targetCanvas.Children.Add(item.InsertedElement); targetCanvas.Children.Add(item.InsertedElement);