word文件加载后是否有触发事件?

问题描述 投票:0回答:1
我目前正在用 C# 开发 Vsto Word Addin。

我正在寻找每次从模板创建新文档并且文档完全加载并显示给用户时触发的事件。

我需要此事件来调整文档的页眉和页脚,并使用此行调用文档信息 (Globals.ThisAddIn.Application.CommandBars.ExecuteMso(‘DocumentInformationShowHide’);)。

我已经测试了“word.Application.DocumentChange”事件,该事件在文档加载并显示给用户之前触发得太早。

public async void Application_DocumentChange() { _logger.Info("Application_DocumentChange event triggered."); ManipulateHeaderAndFooter(); Globals.ThisAddIn.Application.CommandBars.ExecuteMso("DocumentInformationShowHide"); }
当我使用 DocumentChanged 事件时,这会完全阻止 Word:

    在没有打开文档的情况下打开 Word 。
  1. 使用模板甚至空白文档通过 Word UI 创建新文档。
  2. 触发 DocumentChanged 事件并尝试显示文档信息。
  3. Word 阻塞并陷入一种僵局,如屏幕截图所示。
  4. Word UI after blocking
这就是为什么我需要一个稍后触发的事件(在加载文档并已显示给用户之后)或其他解决方法。


编辑: 我已经尝试使用 Application.NewDocument 事件,但此事件也会在文档加载并显示给用户之前提前触发。

c# ms-word vsto office-addins word-addins
1个回答
0
投票

这是我的解决方案。

我使用了事件

ApplicationEvents4_Event.NewDocument

ApplicationEvents4_Event.DocumentOpen
ApplicationEvents4_Event.DocumentChange
 的组合,每个事件针对不同的用例。然而,这些事件有时抛出得太早,因此某些方法(例如打开文档信息)不应该直接执行。在这种情况下,我插入了一个延迟来解决这个问题,并等到Word文档完全加载。 (这只是一个解决方法)

await System.Threading.Tasks.Task.Delay(1000);


重要提示: 在 Word AddIn 中,在等待后访问同步上下文。如果要在等待后访问 COM 对象,则必须使用同步上下文执行此代码。

创建同步上下文(启动时)

if (SynchronizationContext.Current == null) { // Create a new UI context for the add-in because Office AddIns do not have one by default SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext()); } _syncContext = SynchronizationContext.Current;
await 之后使用同步上下文:

_syncContext.Post(_ => { // Operation that accesses the COM-Object }, null);


在某些时候,我在关键操作之前进行了很多操作,以至于我不再需要使用延迟。

© www.soinside.com 2019 - 2024. All rights reserved.