From 3cd26323dc121e48e830fe3ef165550b4b8ea5ca Mon Sep 17 00:00:00 2001
From: CJKmkp <2564608840@qq.com>
Date: Sat, 13 Dec 2025 20:07:25 +0800
Subject: [PATCH] =?UTF-8?q?improve:=E7=BF=BB=E9=A1=B5=E5=A2=A8=E8=BF=B9?=
=?UTF-8?q?=E5=8A=A0=E8=BD=BD=E5=8F=8A=E6=B5=AE=E5=8A=A8=E6=A0=8F=E5=AE=9A?=
=?UTF-8?q?=E4=BD=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../MainWindow_cs/MW_FloatingBarIcons.cs | 5 +-
Ink Canvas/MainWindow_cs/MW_PPT.cs | 324 +++++++++++++-----
2 files changed, 236 insertions(+), 93 deletions(-)
diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs
index e13f851a..7499b754 100644
--- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs
+++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs
@@ -3027,7 +3027,10 @@ namespace Ink_Canvas
await Task.Delay(700);
await Dispatcher.InvokeAsync(() =>
{
- FoldFloatingBar_MouseUp(new object(), null);
+ if (_pptManager?.IsInSlideShow != true)
+ {
+ FoldFloatingBar_MouseUp(new object(), null);
+ }
});
});
}
diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs
index 4e5d1c8d..1a206383 100644
--- a/Ink Canvas/MainWindow_cs/MW_PPT.cs
+++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs
@@ -101,7 +101,8 @@ namespace Ink_Canvas
private DateTime _lastSlideSwitchTime = DateTime.MinValue;
private int _pendingSlideIndex = -1;
private System.Timers.Timer _slideSwitchDebounceTimer;
- private const int SlideSwitchDebounceMs = 150; // 防抖延迟150毫秒
+ private const int SlideSwitchDebounceMs = 150;
+ private bool _isInkClearedByButton = false;
#endregion
#region PPT Managers
@@ -768,19 +769,50 @@ namespace Ink_Canvas
if (!isFloatingBarFolded)
{
- new Thread(() =>
+ _ = Task.Run(async () =>
{
- Thread.Sleep(100);
- Application.Current.Dispatcher.Invoke(() =>
+ try
{
- ViewboxFloatingBarMarginAnimation(60);
- });
- }).Start();
+ await Task.Delay(100);
+
+ await Application.Current.Dispatcher.InvokeAsync(() =>
+ {
+ ViewboxFloatingBar.UpdateLayout();
+
+ // 如果浮动栏宽度仍未计算好,再等待一段时间
+ if (ViewboxFloatingBar.ActualWidth <= 0)
+ {
+ LogHelper.WriteLogToFile("浮动栏宽度未准备好,等待布局完成", LogHelper.LogType.Trace);
+ }
+ });
+
+ await Task.Delay(100);
+
+ await Application.Current.Dispatcher.InvokeAsync(() =>
+ {
+ PureViewboxFloatingBarMarginAnimationInPPTMode(false);
+ });
+ }
+ catch (Exception)
+ {
+
+ try
+ {
+ await Task.Delay(100);
+ await Application.Current.Dispatcher.InvokeAsync(() =>
+ {
+ ViewboxFloatingBarMarginAnimation(60);
+ });
+ }
+ catch (Exception)
+ {
+ }
+ }
+ });
}
}
- catch (Exception ex)
+ catch (Exception)
{
- LogHelper.WriteLogToFile($"处理幻灯片放映开始事件失败: {ex}", LogHelper.LogType.Error);
}
}
@@ -788,7 +820,7 @@ namespace Ink_Canvas
{
try
{
- Application.Current.Dispatcher.InvokeAsync(() =>
+ Application.Current.Dispatcher.Invoke(() =>
{
if (wn?.View == null || wn.Presentation == null)
{
@@ -799,11 +831,54 @@ namespace Ink_Canvas
var activePresentation = wn.Presentation;
var totalSlides = activePresentation.Slides.Count;
+ // 获取之前的页码(用于保存墨迹)
+ var previousSlide = _currentSlideShowPosition > 0 ? _currentSlideShowPosition :
+ (_pptManager?.GetCurrentSlideNumber() ?? 0);
+
+ // 先保存当前页墨迹的副本
+ StrokeCollection strokesToSave = null;
+ if (previousSlide > 0 && previousSlide != currentSlide && inkCanvas.Strokes.Count > 0)
+ {
+ strokesToSave = inkCanvas.Strokes.Clone();
+ }
+
+ if (_isInkClearedByButton)
+ {
+ _isInkClearedByButton = false;
+ }
+ else if (inkCanvas.Strokes.Count > 0)
+ {
+ ClearStrokes(true);
+ timeMachine.ClearStrokeHistory();
+ }
+
// 更新当前播放页码
_currentSlideShowPosition = currentSlide;
- // 使用防抖机制处理页面切换
- HandleSlideSwitchWithDebounce(currentSlide, totalSlides);
+ // 异步保存之前页面的墨迹(不阻塞翻页操作)
+ if (strokesToSave != null && previousSlide > 0 && previousSlide != currentSlide)
+ {
+ Task.Run(() =>
+ {
+ try
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ bool canWrite = _singlePPTInkManager?.CanWriteInk(previousSlide) == true;
+ if (canWrite)
+ {
+ _singlePPTInkManager?.SaveCurrentSlideStrokes(previousSlide, strokesToSave);
+ }
+ });
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"异步保存PPT页面墨迹失败: {ex}", LogHelper.LogType.Error);
+ }
+ });
+ }
+ LoadCurrentSlideInk(currentSlide, skipClear: true); // 跳过清除,因为已在上面清除
+ _pptUIManager?.UpdateCurrentSlideNumber(currentSlide, totalSlides);
});
}
@@ -1104,13 +1179,16 @@ namespace Ink_Canvas
}
}
- private void LoadCurrentSlideInk(int slideIndex)
+ private void LoadCurrentSlideInk(int slideIndex, bool skipClear = false)
{
try
{
- ClearStrokes(true);
- timeMachine.ClearStrokeHistory();
-
+ // 如果未跳过清除,则清除当前墨迹
+ if (!skipClear)
+ {
+ ClearStrokes(true);
+ timeMachine.ClearStrokeHistory();
+ }
StrokeCollection strokes = _singlePPTInkManager?.LoadSlideStrokes(slideIndex);
if (strokes != null && strokes.Count > 0)
@@ -1176,51 +1254,14 @@ namespace Ink_Canvas
///
private void HandleSlideSwitchWithDebounce(int currentSlide, int totalSlides)
{
- try
- {
- var now = DateTime.Now;
-
- // 如果距离上次切换时间太短,使用防抖机制
- if (now - _lastSlideSwitchTime < TimeSpan.FromMilliseconds(SlideSwitchDebounceMs))
- {
- _pendingSlideIndex = currentSlide;
-
- // 停止之前的定时器
- _slideSwitchDebounceTimer?.Stop();
-
- // 创建新的定时器
- _slideSwitchDebounceTimer = new System.Timers.Timer(SlideSwitchDebounceMs);
- _slideSwitchDebounceTimer.Elapsed += (sender, e) =>
- {
- Application.Current.Dispatcher.Invoke(() =>
- {
- if (_pendingSlideIndex > 0)
- {
- SwitchSlideInk(_pendingSlideIndex);
- _pptUIManager?.UpdateCurrentSlideNumber(_pendingSlideIndex, totalSlides);
- _pendingSlideIndex = -1;
- }
- });
- _slideSwitchDebounceTimer?.Stop();
- };
- _slideSwitchDebounceTimer.Start();
- }
- else
- {
- // 直接处理页面切换
- SwitchSlideInk(currentSlide);
- _pptUIManager?.UpdateCurrentSlideNumber(currentSlide, totalSlides);
- }
-
- _lastSlideSwitchTime = now;
- }
- catch (Exception ex)
- {
- LogHelper.WriteLogToFile($"处理页面切换防抖失败: {ex}", LogHelper.LogType.Error);
- }
}
- private void SwitchSlideInk(int newSlideIndex)
+ ///
+ /// 切换页面墨迹
+ ///
+ /// 新页面索引
+ /// 是否跳过清除操作(如果已在翻页时立即清除,则设为true)
+ private void SwitchSlideInk(int newSlideIndex, bool skipClear = false)
{
try
{
@@ -1241,18 +1282,23 @@ namespace Ink_Canvas
}
// 如果有当前墨迹且不是第一次切换,先保存到当前页面
- if (inkCanvas.Strokes.Count > 0 && currentSlideIndex > 0 && currentSlideIndex != newSlideIndex)
+ if (currentSlideIndex > 0 && currentSlideIndex != newSlideIndex)
{
bool canWrite = _singlePPTInkManager?.CanWriteInk(currentSlideIndex) == true;
-
- if (canWrite)
+
+ if (canWrite && inkCanvas.Strokes.Count > 0)
{
_singlePPTInkManager?.SaveCurrentSlideStrokes(currentSlideIndex, inkCanvas.Strokes);
}
}
- ClearStrokes(true);
- timeMachine.ClearStrokeHistory();
+ if (!skipClear)
+ {
+ ClearStrokes(true);
+ timeMachine.ClearStrokeHistory();
+ }
+
+ // 加载新页面的墨迹
StrokeCollection newStrokes = _singlePPTInkManager?.SwitchToSlide(newSlideIndex, null);
if (newStrokes != null && newStrokes.Count > 0)
@@ -1389,25 +1435,72 @@ namespace Ink_Canvas
{
try
{
- // 保存当前页墨迹
- var currentSlide = _pptManager?.GetCurrentSlideNumber() ?? 0;
- if (currentSlide > 0)
+ var previousSlideBeforeNavigate = _pptManager?.GetCurrentSlideNumber() ?? 0;
+
+ StrokeCollection strokesToSave = null;
+ if (previousSlideBeforeNavigate > 0 && inkCanvas.Strokes.Count > 0)
{
- _singlePPTInkManager?.SaveCurrentSlideStrokes(currentSlide, inkCanvas.Strokes);
+ strokesToSave = inkCanvas.Strokes.Clone();
}
- // 保存截图(如果启用)
- if (inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber &&
- Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint)
- {
- var presentationName = _pptManager?.GetPresentationName() ?? "";
- SaveScreenShot(true, $"{presentationName}/{currentSlide}");
- }
-
- // 执行翻页
if (_pptManager?.TryNavigatePrevious() == true)
{
- // 翻页成功,等待事件处理墨迹切换
+ var currentSlideAfterNavigate = _pptManager?.GetCurrentSlideNumber() ?? 0;
+
+ if (previousSlideBeforeNavigate == currentSlideAfterNavigate && previousSlideBeforeNavigate > 0)
+ {
+ Thread.Sleep(50);
+ currentSlideAfterNavigate = _pptManager?.GetCurrentSlideNumber() ?? 0;
+ }
+
+ if (previousSlideBeforeNavigate != currentSlideAfterNavigate && previousSlideBeforeNavigate > 0)
+ {
+ if (inkCanvas.Strokes.Count > 0)
+ {
+ ClearStrokes(true);
+ timeMachine.ClearStrokeHistory();
+ _isInkClearedByButton = true;
+ }
+
+ if (strokesToSave != null && previousSlideBeforeNavigate > 0)
+ {
+ Task.Run(() =>
+ {
+ try
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ _singlePPTInkManager?.SaveCurrentSlideStrokes(previousSlideBeforeNavigate, strokesToSave);
+ });
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"异步保存PPT上一页墨迹失败: {ex}", LogHelper.LogType.Error);
+ }
+ });
+
+ // 异步保存截图(如果启用)
+ if (strokesToSave.Count > Settings.Automation.MinimumAutomationStrokeNumber &&
+ Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint)
+ {
+ Task.Run(() =>
+ {
+ try
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var presentationName = _pptManager?.GetPresentationName() ?? "";
+ SaveScreenShot(true, $"{presentationName}/{previousSlideBeforeNavigate}");
+ });
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"异步保存PPT上一页截图失败: {ex}", LogHelper.LogType.Error);
+ }
+ });
+ }
+ }
+ }
}
else
{
@@ -1429,25 +1522,72 @@ namespace Ink_Canvas
{
try
{
- // 保存当前页墨迹
- var currentSlide = _pptManager?.GetCurrentSlideNumber() ?? 0;
- if (currentSlide > 0)
+ var previousSlideBeforeNavigate = _pptManager?.GetCurrentSlideNumber() ?? 0;
+
+ StrokeCollection strokesToSave = null;
+ if (previousSlideBeforeNavigate > 0 && inkCanvas.Strokes.Count > 0)
{
- _singlePPTInkManager?.SaveCurrentSlideStrokes(currentSlide, inkCanvas.Strokes);
+ strokesToSave = inkCanvas.Strokes.Clone();
}
- // 保存截图(如果启用)
- if (inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber &&
- Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint)
- {
- var presentationName = _pptManager?.GetPresentationName() ?? "";
- SaveScreenShot(true, $"{presentationName}/{currentSlide}");
- }
-
- // 执行翻页
if (_pptManager?.TryNavigateNext() == true)
{
- // 翻页成功,等待事件处理墨迹切换
+ var currentSlideAfterNavigate = _pptManager?.GetCurrentSlideNumber() ?? 0;
+
+ if (previousSlideBeforeNavigate == currentSlideAfterNavigate && previousSlideBeforeNavigate > 0)
+ {
+ Thread.Sleep(50);
+ currentSlideAfterNavigate = _pptManager?.GetCurrentSlideNumber() ?? 0;
+ }
+
+ if (previousSlideBeforeNavigate != currentSlideAfterNavigate && previousSlideBeforeNavigate > 0)
+ {
+ if (inkCanvas.Strokes.Count > 0)
+ {
+ ClearStrokes(true);
+ timeMachine.ClearStrokeHistory();
+ _isInkClearedByButton = true;
+ }
+
+ if (strokesToSave != null && previousSlideBeforeNavigate > 0)
+ {
+ Task.Run(() =>
+ {
+ try
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ _singlePPTInkManager?.SaveCurrentSlideStrokes(previousSlideBeforeNavigate, strokesToSave);
+ });
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"异步保存PPT下一页墨迹失败: {ex}", LogHelper.LogType.Error);
+ }
+ });
+
+ // 异步保存截图(如果启用)
+ if (strokesToSave.Count > Settings.Automation.MinimumAutomationStrokeNumber &&
+ Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint)
+ {
+ Task.Run(() =>
+ {
+ try
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var presentationName = _pptManager?.GetPresentationName() ?? "";
+ SaveScreenShot(true, $"{presentationName}/{previousSlideBeforeNavigate}");
+ });
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"异步保存PPT下一页截图失败: {ex}", LogHelper.LogType.Error);
+ }
+ });
+ }
+ }
+ }
}
else
{