improve:PPT增强预览
This commit is contained in:
@@ -2275,7 +2275,7 @@ namespace Ink_Canvas
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var slides = await Task.Run(BuildPptPreviewItems);
|
var slides = await RunOnStaAsync(BuildPptPreviewItems);
|
||||||
if (slides == null || slides.Count == 0)
|
if (slides == null || slides.Count == 0)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile("PPT增强预览未生成可用缩略图,改用默认导航", LogHelper.LogType.Warning);
|
LogHelper.WriteLogToFile("PPT增强预览未生成可用缩略图,改用默认导航", LogHelper.LogType.Warning);
|
||||||
@@ -2360,8 +2360,14 @@ namespace Ink_Canvas
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>在 MainWindow 加载完成后调用,把 4 个 PptNavBar 的事件接到本类。</summary>
|
/// <summary>在 MainWindow 加载完成后调用,把 4 个 PptNavBar 的事件接到本类。</summary>
|
||||||
|
private bool _pptNavBarsWired;
|
||||||
|
|
||||||
private void WirePptNavBars()
|
private void WirePptNavBars()
|
||||||
{
|
{
|
||||||
|
// InitializePPTManagers 可能被多次调用(切换 COM/ROT、设置变更等)。
|
||||||
|
// PptNavBar 事件若在同一控件上重复订阅,会导致翻页、长按、预览展开等逻辑成倍触发。
|
||||||
|
if (_pptNavBarsWired) return;
|
||||||
|
|
||||||
var bars = new[]
|
var bars = new[]
|
||||||
{
|
{
|
||||||
LeftBottomPanelForPPTNavigation,
|
LeftBottomPanelForPPTNavigation,
|
||||||
@@ -2390,6 +2396,8 @@ namespace Ink_Canvas
|
|||||||
bar.SlideSelected += (s, slideNumber) => OnPptNavBarSlideSelected(captured, slideNumber);
|
bar.SlideSelected += (s, slideNumber) => OnPptNavBarSlideSelected(captured, slideNumber);
|
||||||
bar.PreviewExpandedChanged += (s, expanded) => OnPptNavBarPreviewExpandedChanged(captured, expanded);
|
bar.PreviewExpandedChanged += (s, expanded) => OnPptNavBarPreviewExpandedChanged(captured, expanded);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_pptNavBarsWired = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool _suppressPreviewExpandedSync;
|
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()
|
private List<PptEnhancedPreviewItem> BuildPptPreviewItems()
|
||||||
{
|
{
|
||||||
var result = new List<PptEnhancedPreviewItem>();
|
var result = new List<PptEnhancedPreviewItem>();
|
||||||
|
|||||||
Reference in New Issue
Block a user