我正在寻找每次从模板创建新文档并且文档完全加载并显示给用户时触发的事件。
我需要此事件来调整文档的页眉和页脚,并使用此行调用文档信息 (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:
编辑: 我已经尝试使用 Application.NewDocument 事件,但此事件也会在文档加载并显示给用户之前提前触发。
这是我的解决方案。
我使用了事件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);