improve:PPT增强预览

This commit is contained in:
2026-05-02 09:53:41 +08:00
parent ef9b211677
commit 2d9901791c
+25 -1
View File
@@ -2275,7 +2275,7 @@ namespace Ink_Canvas
}
else
{
var slides = await Task.Run(BuildPptPreviewItems);
var slides = await RunOnStaAsync(BuildPptPreviewItems);
if (slides == null || slides.Count == 0)
{
LogHelper.WriteLogToFile("PPT增强预览未生成可用缩略图,改用默认导航", LogHelper.LogType.Warning);
@@ -2360,8 +2360,14 @@ namespace Ink_Canvas
}
/// <summary>在 MainWindow 加载完成后调用,把 4 个 PptNavBar 的事件接到本类。</summary>
private bool _pptNavBarsWired;
private void WirePptNavBars()
{
// InitializePPTManagers 可能被多次调用(切换 COM/ROT、设置变更等)。
// PptNavBar 事件若在同一控件上重复订阅,会导致翻页、长按、预览展开等逻辑成倍触发。
if (_pptNavBarsWired) return;
var bars = new[]
{
LeftBottomPanelForPPTNavigation,
@@ -2390,6 +2396,8 @@ namespace Ink_Canvas
bar.SlideSelected += (s, slideNumber) => OnPptNavBarSlideSelected(captured, slideNumber);
bar.PreviewExpandedChanged += (s, expanded) => OnPptNavBarPreviewExpandedChanged(captured, expanded);
}
_pptNavBarsWired = true;
}
private bool _suppressPreviewExpandedSync;
@@ -2460,6 +2468,22 @@ namespace Ink_Canvas
}
}
private static Task<T> RunOnStaAsync<T>(Func<T> func)
{
// Office interop 要求 STA + COM 单元;Task.Run 跑到 MTA 线程池里会触发 RPC_E_WRONG_THREAD
// 等随机 COM 失败,表现为增强预览空白或崩溃。显式创建 STA worker 在其中执行导出。
var tcs = new TaskCompletionSource<T>();
var thread = new Thread(() =>
{
try { tcs.SetResult(func()); }
catch (Exception ex) { tcs.SetException(ex); }
});
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return tcs.Task;
}
private List<PptEnhancedPreviewItem> BuildPptPreviewItems()
{
var result = new List<PptEnhancedPreviewItem>();