fix:翻页控件崩溃

This commit is contained in:
2025-07-20 16:14:26 +08:00
parent 62d35127b1
commit c73a5c3a7e
+370 -125
View File
@@ -65,7 +65,15 @@ namespace Ink_Canvas {
} }
catch { catch {
// 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象 // 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象
slide = pptApplication.SlideShowWindows[1].View.Slide; try {
if (pptApplication.SlideShowWindows != null && pptApplication.SlideShowWindows.Count >= 1)
{
slide = pptApplication.SlideShowWindows[1].View.Slide;
}
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"获取当前幻灯片失败: {ex.ToString()}", LogHelper.LogType.Error);
}
} }
} }
@@ -73,7 +81,8 @@ namespace Ink_Canvas {
//BtnCheckPPT.Visibility = Visibility.Collapsed; //BtnCheckPPT.Visibility = Visibility.Collapsed;
StackPanelPPTControls.Visibility = Visibility.Visible; StackPanelPPTControls.Visibility = Visibility.Visible;
} }
catch { catch (Exception ex) {
LogHelper.WriteLogToFile($"检查PPT应用程序失败: {ex.ToString()}", LogHelper.LogType.Error);
//BtnCheckPPT.Visibility = Visibility.Visible; //BtnCheckPPT.Visibility = Visibility.Visible;
StackPanelPPTControls.Visibility = Visibility.Collapsed; StackPanelPPTControls.Visibility = Visibility.Collapsed;
LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed;
@@ -130,7 +139,15 @@ namespace Ink_Canvas {
} }
catch { catch {
// 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象 // 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象
slide = pptApplication.SlideShowWindows[1].View.Slide; try {
if (pptApplication.SlideShowWindows != null && pptApplication.SlideShowWindows.Count >= 1)
{
slide = pptApplication.SlideShowWindows[1].View.Slide;
}
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"获取当前幻灯片失败: {ex.ToString()}", LogHelper.LogType.Error);
}
} }
pptApplication.PresentationOpen += PptApplication_PresentationOpen; pptApplication.PresentationOpen += PptApplication_PresentationOpen;
@@ -147,10 +164,18 @@ namespace Ink_Canvas {
PptApplication_PresentationOpen(null); PptApplication_PresentationOpen(null);
//如果检测到已经开始放映,则立即进入画板模式 //如果检测到已经开始放映,则立即进入画板模式
if (pptApplication.SlideShowWindows.Count >= 1) if (pptApplication.SlideShowWindows != null && pptApplication.SlideShowWindows.Count >= 1)
PptApplication_SlideShowBegin(pptApplication.SlideShowWindows[1]); {
try {
PptApplication_SlideShowBegin(pptApplication.SlideShowWindows[1]);
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"启动幻灯片放映失败: {ex.ToString()}", LogHelper.LogType.Error);
}
}
} }
catch { catch (Exception ex) {
LogHelper.WriteLogToFile($"检查PPT状态失败: {ex.ToString()}", LogHelper.LogType.Error);
//StackPanelPPTControls.Visibility = Visibility.Collapsed; //StackPanelPPTControls.Visibility = Visibility.Collapsed;
Application.Current.Dispatcher.Invoke(() => { BtnPPTSlideShow.Visibility = Visibility.Collapsed; }); Application.Current.Dispatcher.Invoke(() => { BtnPPTSlideShow.Visibility = Visibility.Collapsed; });
timerCheckPPT.Start(); timerCheckPPT.Start();
@@ -161,82 +186,143 @@ namespace Ink_Canvas {
// 跳转到上次播放页 // 跳转到上次播放页
if (Settings.PowerPointSettings.IsNotifyPreviousPage) if (Settings.PowerPointSettings.IsNotifyPreviousPage)
Application.Current.Dispatcher.BeginInvoke(new Action(() => { Application.Current.Dispatcher.BeginInvoke(new Action(() => {
var folderPath = Settings.Automation.AutoSavedStrokesLocation +
@"\Auto Saved - Presentations\" + presentation.Name + "_" +
presentation.Slides.Count;
try { try {
if (!File.Exists(folderPath + "/Position")) return; // 添加安全检查
if (!int.TryParse(File.ReadAllText(folderPath + "/Position"), out var page)) return; if (presentation == null)
if (page <= 0) return; {
new YesOrNoNotificationWindow($"上次播放到了第 {page} 页, 是否立即跳转", () => { LogHelper.WriteLogToFile("演示文稿为空,无法跳转到上次播放页", LogHelper.LogType.Warning);
if (pptApplication.SlideShowWindows.Count >= 1) return;
// 如果已经播放了的话, 跳转 }
presentation.SlideShowWindow.View.GotoSlide(page);
else var folderPath = Settings.Automation.AutoSavedStrokesLocation +
presentation.Windows[1].View.GotoSlide(page); @"\Auto Saved - Presentations\" + presentation.Name + "_" +
}).ShowDialog(); presentation.Slides.Count;
try {
if (!File.Exists(folderPath + "/Position")) return;
if (!int.TryParse(File.ReadAllText(folderPath + "/Position"), out var page)) return;
if (page <= 0) return;
new YesOrNoNotificationWindow($"上次播放到了第 {page} 页, 是否立即跳转", () => {
try {
if (pptApplication != null && pptApplication.SlideShowWindows != null && pptApplication.SlideShowWindows.Count >= 1)
// 如果已经播放了的话, 跳转
presentation.SlideShowWindow.View.GotoSlide(page);
else if (presentation.Windows != null && presentation.Windows.Count >= 1)
presentation.Windows[1].View.GotoSlide(page);
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"跳转到指定页面失败: {ex.ToString()}", LogHelper.LogType.Error);
}
}).ShowDialog();
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"读取上次播放位置失败: {ex.ToString()}", LogHelper.LogType.Error);
}
} }
catch (Exception ex) { catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error); LogHelper.WriteLogToFile($"处理上次播放页跳转失败: {ex.ToString()}", LogHelper.LogType.Error);
} }
}), DispatcherPriority.Normal); }), DispatcherPriority.Normal);
//检查是否有隐藏幻灯片 //检查是否有隐藏幻灯片
if (Settings.PowerPointSettings.IsNotifyHiddenPage) { if (Settings.PowerPointSettings.IsNotifyHiddenPage) {
var isHaveHiddenSlide = false; try {
foreach (Slide slide in slides) var isHaveHiddenSlide = false;
if (slide.SlideShowTransition.Hidden == Microsoft.Office.Core.MsoTriState.msoTrue) { if (slides != null)
isHaveHiddenSlide = true; {
break; foreach (Slide slide in slides)
if (slide.SlideShowTransition.Hidden == Microsoft.Office.Core.MsoTriState.msoTrue) {
isHaveHiddenSlide = true;
break;
}
} }
Application.Current.Dispatcher.BeginInvoke(new Action(() => { Application.Current.Dispatcher.BeginInvoke(new Action(() => {
if (isHaveHiddenSlide && !IsShowingRestoreHiddenSlidesWindow) { if (isHaveHiddenSlide && !IsShowingRestoreHiddenSlidesWindow) {
IsShowingRestoreHiddenSlidesWindow = true; IsShowingRestoreHiddenSlidesWindow = true;
new YesOrNoNotificationWindow("检测到此演示文档中包含隐藏的幻灯片,是否取消隐藏?", new YesOrNoNotificationWindow("检测到此演示文档中包含隐藏的幻灯片,是否取消隐藏?",
() => { () => {
foreach (Slide slide in slides) try {
if (slide.SlideShowTransition.Hidden == if (slides != null)
Microsoft.Office.Core.MsoTriState.msoTrue) {
slide.SlideShowTransition.Hidden = foreach (Slide slide in slides)
Microsoft.Office.Core.MsoTriState.msoFalse; if (slide.SlideShowTransition.Hidden ==
IsShowingRestoreHiddenSlidesWindow = false; Microsoft.Office.Core.MsoTriState.msoTrue)
}, () => { IsShowingRestoreHiddenSlidesWindow = false; }, slide.SlideShowTransition.Hidden =
() => { IsShowingRestoreHiddenSlidesWindow = false; }).ShowDialog(); Microsoft.Office.Core.MsoTriState.msoFalse;
} }
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"取消隐藏幻灯片失败: {ex.ToString()}", LogHelper.LogType.Error);
}
finally {
IsShowingRestoreHiddenSlidesWindow = false;
}
}, () => { IsShowingRestoreHiddenSlidesWindow = false; },
() => { IsShowingRestoreHiddenSlidesWindow = false; }).ShowDialog();
}
BtnPPTSlideShow.Visibility = Visibility.Visible; BtnPPTSlideShow.Visibility = Visibility.Visible;
}), DispatcherPriority.Normal); }), DispatcherPriority.Normal);
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"检查隐藏幻灯片失败: {ex.ToString()}", LogHelper.LogType.Error);
}
} }
//检测是否有自动播放 //检测是否有自动播放
if (Settings.PowerPointSettings.IsNotifyAutoPlayPresentation if (Settings.PowerPointSettings.IsNotifyAutoPlayPresentation
// && presentation.SlideShowSettings.AdvanceMode == PpSlideShowAdvanceMode.ppSlideShowUseSlideTimings // && presentation.SlideShowSettings.AdvanceMode == PpSlideShowAdvanceMode.ppSlideShowUseSlideTimings
&& BtnPPTSlideShowEnd.Visibility != Visibility.Visible) { && BtnPPTSlideShowEnd.Visibility != Visibility.Visible) {
bool hasSlideTimings = false; try {
foreach (Slide slide in presentation.Slides) { bool hasSlideTimings = false;
if (slide.SlideShowTransition.AdvanceOnTime == MsoTriState.msoTrue && if (presentation != null && presentation.Slides != null)
slide.SlideShowTransition.AdvanceTime > 0) { {
hasSlideTimings = true; foreach (Slide slide in presentation.Slides) {
break; if (slide.SlideShowTransition.AdvanceOnTime == MsoTriState.msoTrue &&
slide.SlideShowTransition.AdvanceTime > 0) {
hasSlideTimings = true;
break;
}
}
}
if (hasSlideTimings) {
Application.Current.Dispatcher.BeginInvoke((Action)(() => {
if (hasSlideTimings && !IsShowingAutoplaySlidesWindow) {
IsShowingAutoplaySlidesWindow = true;
new YesOrNoNotificationWindow("检测到此演示文档中自动播放或排练计时已经启用,可能导致幻灯片自动翻页,是否取消?",
() => {
try {
if (presentation != null)
{
presentation.SlideShowSettings.AdvanceMode =
PpSlideShowAdvanceMode.ppSlideShowManualAdvance;
}
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"设置手动播放模式失败: {ex.ToString()}", LogHelper.LogType.Error);
}
finally {
IsShowingAutoplaySlidesWindow = false;
}
}, () => { IsShowingAutoplaySlidesWindow = false; },
() => { IsShowingAutoplaySlidesWindow = false; }).ShowDialog();
}
}));
try {
if (presentation != null)
{
presentation.SlideShowSettings.AdvanceMode = PpSlideShowAdvanceMode.ppSlideShowManualAdvance;
}
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"设置演示文稿播放模式失败: {ex.ToString()}", LogHelper.LogType.Error);
}
} }
} }
catch (Exception ex) {
if (hasSlideTimings) { LogHelper.WriteLogToFile($"检查自动播放设置失败: {ex.ToString()}", LogHelper.LogType.Error);
Application.Current.Dispatcher.BeginInvoke((Action)(() => {
if (hasSlideTimings && !IsShowingAutoplaySlidesWindow) {
IsShowingAutoplaySlidesWindow = true;
new YesOrNoNotificationWindow("检测到此演示文档中自动播放或排练计时已经启用,可能导致幻灯片自动翻页,是否取消?",
() => {
presentation.SlideShowSettings.AdvanceMode =
PpSlideShowAdvanceMode.ppSlideShowManualAdvance;
IsShowingAutoplaySlidesWindow = false;
}, () => { IsShowingAutoplaySlidesWindow = false; },
() => { IsShowingAutoplaySlidesWindow = false; }).ShowDialog();
}
}));
presentation.SlideShowSettings.AdvanceMode = PpSlideShowAdvanceMode.ppSlideShowManualAdvance;
} }
} }
} }
@@ -401,7 +487,7 @@ namespace Ink_Canvas {
// 检查是否应该显示PPT按钮 // 检查是否应该显示PPT按钮
bool shouldShowButtons = Settings.PowerPointSettings.ShowPPTButton && bool shouldShowButtons = Settings.PowerPointSettings.ShowPPTButton &&
(BtnPPTSlideShowEnd.Visibility == Visibility.Visible || (BtnPPTSlideShowEnd.Visibility == Visibility.Visible ||
(pptApplication != null && pptApplication.SlideShowWindows.Count > 0)); (pptApplication != null && pptApplication.SlideShowWindows != null && pptApplication.SlideShowWindows.Count > 0));
if (!shouldShowButtons) if (!shouldShowButtons)
{ {
@@ -429,7 +515,7 @@ namespace Ink_Canvas {
else RightSidePanelForPPTNavigation.Visibility = Visibility.Collapsed; else RightSidePanelForPPTNavigation.Visibility = Visibility.Collapsed;
} }
catch (Exception ex) { catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error); LogHelper.WriteLogToFile($"更新PPT按钮显示状态失败: {ex.ToString()}", LogHelper.LogType.Error);
} }
} }
@@ -671,6 +757,13 @@ namespace Ink_Canvas {
private void PptApplication_SlideShowNextSlide(SlideShowWindow Wn) { private void PptApplication_SlideShowNextSlide(SlideShowWindow Wn) {
try { try {
// 添加安全检查
if (Wn == null || Wn.View == null)
{
LogHelper.WriteLogToFile("幻灯片放映窗口或视图为空", LogHelper.LogType.Warning);
return;
}
LogHelper.WriteLogToFile($"PowerPoint Next Slide (Slide {Wn.View.CurrentShowPosition})", LogHelper.WriteLogToFile($"PowerPoint Next Slide (Slide {Wn.View.CurrentShowPosition})",
LogHelper.LogType.Event); LogHelper.LogType.Event);
if (Wn.View.CurrentShowPosition == previousSlideID) return; if (Wn.View.CurrentShowPosition == previousSlideID) return;
@@ -700,14 +793,14 @@ namespace Ink_Canvas {
PPTBtnPageTotal.Text = $"/ {Wn.Presentation.Slides.Count}"; PPTBtnPageTotal.Text = $"/ {Wn.Presentation.Slides.Count}";
} }
catch (Exception ex) { catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error); LogHelper.WriteLogToFile($"处理幻灯片切换时出错: {ex.ToString()}", LogHelper.LogType.Error);
} }
}); });
previousSlideID = Wn.View.CurrentShowPosition; previousSlideID = Wn.View.CurrentShowPosition;
} }
catch (Exception ex) { catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error); LogHelper.WriteLogToFile($"幻灯片切换事件处理失败: {ex.ToString()}", LogHelper.LogType.Error);
} }
} }
@@ -724,30 +817,70 @@ namespace Ink_Canvas {
_isPptClickingBtnTurned = true; _isPptClickingBtnTurned = true;
if (inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber && // 添加安全检查
Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint) if (pptApplication == null)
SaveScreenShot(true, {
pptApplication.SlideShowWindows[1].Presentation.Name + "/" + LogHelper.WriteLogToFile("PPT应用程序为空,无法执行上一页操作", LogHelper.LogType.Warning);
pptApplication.SlideShowWindows[1].View.CurrentShowPosition); return;
}
try
{
// 检查SlideShowWindows是否存在且有效
if (pptApplication.SlideShowWindows == null || pptApplication.SlideShowWindows.Count == 0)
{
LogHelper.WriteLogToFile("PPT放映窗口不存在,无法执行上一页操作", LogHelper.LogType.Warning);
return;
}
// 安全访问当前幻灯片信息
if (pptApplication.SlideShowWindows.Count >= 1)
{
var slideShowWindow = pptApplication.SlideShowWindows[1];
if (slideShowWindow != null && slideShowWindow.View != null)
{
if (inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber &&
Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint)
SaveScreenShot(true,
slideShowWindow.Presentation.Name + "/" +
slideShowWindow.View.CurrentShowPosition);
}
}
try {
new Thread(new ThreadStart(() => { new Thread(new ThreadStart(() => {
try { try {
pptApplication.SlideShowWindows[1].Activate(); // 安全访问SlideShowWindows[1]
if (pptApplication.SlideShowWindows.Count >= 1)
{
var slideShowWindow = pptApplication.SlideShowWindows[1];
if (slideShowWindow != null)
{
slideShowWindow.Activate();
}
}
} }
catch { catch (Exception ex) {
// ignored LogHelper.WriteLogToFile($"激活PPT放映窗口失败: {ex.ToString()}", LogHelper.LogType.Error);
} }
try { try {
pptApplication.SlideShowWindows[1].View.Previous(); // 安全访问SlideShowWindows[1]
if (pptApplication.SlideShowWindows.Count >= 1)
{
var slideShowWindow = pptApplication.SlideShowWindows[1];
if (slideShowWindow != null && slideShowWindow.View != null)
{
slideShowWindow.View.Previous();
}
}
} }
catch { catch (Exception ex) {
// ignored LogHelper.WriteLogToFile($"PPT上一页操作失败: {ex.ToString()}", LogHelper.LogType.Error);
} // Without this catch{}, app will crash when click the pre-page button in the fir page in some special env. } // Without this catch{}, app will crash when click the pre-page button in the fir page in some special env.
})).Start(); })).Start();
} }
catch { catch (Exception ex) {
LogHelper.WriteLogToFile($"PPT上一页操作异常: {ex.ToString()}", LogHelper.LogType.Error);
StackPanelPPTControls.Visibility = Visibility.Collapsed; StackPanelPPTControls.Visibility = Visibility.Collapsed;
LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed;
RightBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; RightBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed;
@@ -766,29 +899,71 @@ namespace Ink_Canvas {
} }
_isPptClickingBtnTurned = true; _isPptClickingBtnTurned = true;
if (inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber &&
Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint) // 添加安全检查
SaveScreenShot(true, if (pptApplication == null)
pptApplication.SlideShowWindows[1].Presentation.Name + "/" + {
pptApplication.SlideShowWindows[1].View.CurrentShowPosition); LogHelper.WriteLogToFile("PPT应用程序为空,无法执行下一页操作", LogHelper.LogType.Warning);
try { return;
}
try
{
// 检查SlideShowWindows是否存在且有效
if (pptApplication.SlideShowWindows == null || pptApplication.SlideShowWindows.Count == 0)
{
LogHelper.WriteLogToFile("PPT放映窗口不存在,无法执行下一页操作", LogHelper.LogType.Warning);
return;
}
// 安全访问当前幻灯片信息
if (pptApplication.SlideShowWindows.Count >= 1)
{
var slideShowWindow = pptApplication.SlideShowWindows[1];
if (slideShowWindow != null && slideShowWindow.View != null)
{
if (inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber &&
Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint)
SaveScreenShot(true,
slideShowWindow.Presentation.Name + "/" +
slideShowWindow.View.CurrentShowPosition);
}
}
new Thread(new ThreadStart(() => { new Thread(new ThreadStart(() => {
try { try {
pptApplication.SlideShowWindows[1].Activate(); // 安全访问SlideShowWindows[1]
if (pptApplication.SlideShowWindows.Count >= 1)
{
var slideShowWindow = pptApplication.SlideShowWindows[1];
if (slideShowWindow != null)
{
slideShowWindow.Activate();
}
}
} }
catch { catch (Exception ex) {
// ignored LogHelper.WriteLogToFile($"激活PPT放映窗口失败: {ex.ToString()}", LogHelper.LogType.Error);
} }
try { try {
pptApplication.SlideShowWindows[1].View.Next(); // 安全访问SlideShowWindows[1]
if (pptApplication.SlideShowWindows.Count >= 1)
{
var slideShowWindow = pptApplication.SlideShowWindows[1];
if (slideShowWindow != null && slideShowWindow.View != null)
{
slideShowWindow.View.Next();
}
}
} }
catch { catch (Exception ex) {
// ignored LogHelper.WriteLogToFile($"PPT下一页操作失败: {ex.ToString()}", LogHelper.LogType.Error);
} }
})).Start(); })).Start();
} }
catch { catch (Exception ex) {
LogHelper.WriteLogToFile($"PPT下一页操作异常: {ex.ToString()}", LogHelper.LogType.Error);
StackPanelPPTControls.Visibility = Visibility.Collapsed; StackPanelPPTControls.Visibility = Visibility.Collapsed;
LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed;
RightBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed; RightBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed;
@@ -862,18 +1037,50 @@ namespace Ink_Canvas {
if (!Settings.PowerPointSettings.EnablePPTButtonPageClickable) return; if (!Settings.PowerPointSettings.EnablePPTButtonPageClickable) return;
GridTransparencyFakeBackground.Opacity = 1; // 添加安全检查
GridTransparencyFakeBackground.Background = new SolidColorBrush(StringToColor("#01FFFFFF")); if (pptApplication == null)
CursorIcon_Click(null, null); {
try { LogHelper.WriteLogToFile("PPT应用程序为空,无法执行翻页操作", LogHelper.LogType.Warning);
pptApplication.SlideShowWindows[1].SlideNavigation.Visible = true; return;
} }
catch { }
// 控制居中 try
if (!isFloatingBarFolded) { {
await Task.Delay(100); // 检查SlideShowWindows是否存在且有效
ViewboxFloatingBarMarginAnimation(60); if (pptApplication.SlideShowWindows == null || pptApplication.SlideShowWindows.Count == 0)
{
LogHelper.WriteLogToFile("PPT放映窗口不存在,无法执行翻页操作", LogHelper.LogType.Warning);
return;
}
GridTransparencyFakeBackground.Opacity = 1;
GridTransparencyFakeBackground.Background = new SolidColorBrush(StringToColor("#01FFFFFF"));
CursorIcon_Click(null, null);
try {
// 安全访问SlideShowWindows[1]
if (pptApplication.SlideShowWindows.Count >= 1)
{
var slideShowWindow = pptApplication.SlideShowWindows[1];
if (slideShowWindow != null)
{
slideShowWindow.SlideNavigation.Visible = true;
}
}
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"设置PPT导航可见性失败: {ex.ToString()}", LogHelper.LogType.Error);
}
// 控制居中
if (!isFloatingBarFolded) {
await Task.Delay(100);
ViewboxFloatingBarMarginAnimation(60);
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"PPT翻页控件操作失败: {ex.ToString()}", LogHelper.LogType.Error);
} }
} }
@@ -887,30 +1094,68 @@ namespace Ink_Canvas {
} }
private async void BtnPPTSlideShowEnd_Click(object sender, RoutedEventArgs e) { private async void BtnPPTSlideShowEnd_Click(object sender, RoutedEventArgs e) {
Application.Current.Dispatcher.Invoke(() => { // 添加安全检查
try { if (pptApplication == null)
var ms = new MemoryStream(); {
inkCanvas.Strokes.Save(ms); LogHelper.WriteLogToFile("PPT应用程序为空,无法结束放映", LogHelper.LogType.Warning);
ms.Position = 0; return;
memoryStreams[pptApplication.SlideShowWindows[1].View.CurrentShowPosition] = ms; }
timeMachine.ClearStrokeHistory();
}
catch {
// ignored
}
});
new Thread(new ThreadStart(() => {
try {
pptApplication.SlideShowWindows[1].View.Exit();
}
catch {
// ignored
}
})).Start();
HideSubPanels("cursor"); try
await Task.Delay(150); {
ViewboxFloatingBarMarginAnimation(100, true); // 检查SlideShowWindows是否存在且有效
if (pptApplication.SlideShowWindows == null || pptApplication.SlideShowWindows.Count == 0)
{
LogHelper.WriteLogToFile("PPT放映窗口不存在,无法结束放映", LogHelper.LogType.Warning);
return;
}
Application.Current.Dispatcher.Invoke(() => {
try {
// 安全访问SlideShowWindows[1]
if (pptApplication.SlideShowWindows.Count >= 1)
{
var slideShowWindow = pptApplication.SlideShowWindows[1];
if (slideShowWindow != null && slideShowWindow.View != null)
{
var ms = new MemoryStream();
inkCanvas.Strokes.Save(ms);
ms.Position = 0;
memoryStreams[slideShowWindow.View.CurrentShowPosition] = ms;
timeMachine.ClearStrokeHistory();
}
}
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"保存当前页面墨迹失败: {ex.ToString()}", LogHelper.LogType.Error);
}
});
new Thread(new ThreadStart(() => {
try {
// 安全访问SlideShowWindows[1]
if (pptApplication.SlideShowWindows.Count >= 1)
{
var slideShowWindow = pptApplication.SlideShowWindows[1];
if (slideShowWindow != null && slideShowWindow.View != null)
{
slideShowWindow.View.Exit();
}
}
}
catch (Exception ex) {
LogHelper.WriteLogToFile($"退出PPT放映失败: {ex.ToString()}", LogHelper.LogType.Error);
}
})).Start();
HideSubPanels("cursor");
await Task.Delay(150);
ViewboxFloatingBarMarginAnimation(100, true);
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"结束PPT放映操作异常: {ex.ToString()}", LogHelper.LogType.Error);
}
} }
private void GridPPTControlPrevious_MouseDown(object sender, MouseButtonEventArgs e) private void GridPPTControlPrevious_MouseDown(object sender, MouseButtonEventArgs e)