首次加载Microsoft Word时,不会触发NewDocument和DocumentOpen事件。当Word的一个实例已经打开并且打开一个新文档或现有文档时,这些事件就会正常运行。
我看到的建议是处理DocumentChange事件(在Word加载时始终触发)而不是其他两个事件。
我的问题是我该如何解决这个问题? DocumentChange事件没有任何参数,那么我怎么知道刚刚打开文档(新文件还是现有文件)?
此外,我已经在DocumentChange事件中有逻辑,并且对新文档和现有文档的处理是不同的,所以我不能只将所有代码都放入事件中。
private void ThisAddIn_Startup(object sender, System.EventArgs a)
{
this.Application.DocumentChange += new ApplicationEvents4_DocumentChangeEventHandler(Application_DocumentChange);
}
private void Application_DocumentChange()
{
// How do I handle NewDocument or DocumentOpen?
}
答案 0 :(得分:2)
This链接可以帮助您,基本上他们说的是ThisAddIn_Startup在 DocumentOpen事件完成后运行。只需按照超链接即可解决问题。
答案 1 :(得分:2)
所以我最终在ThisAddIn_Startup中处理加载的文档。如果文档的路径是空字符串,那么我们知道该文档是新的并且从未保存在本地计算机上。否则,我知道它已保存(包括在临时目录中),我将其作为现有文档处理。
private void ThisAddIn_Startup(object sender, System.EventArgs a)
{
try
{
Word.Document doc = this.Application.ActiveDocument;
if (String.IsNullOrWhiteSpace(doc.Path))
{
ProcessNewDocument(doc);
}
else
{
ProcessDocumentOpen(doc);
}
}
catch (COMException e)
{
log.Debug("No document loaded with word.");
}
// These can be set anywhere in the method, because they are not fired for documents loaded when Word is initialized.
((MSWord.ApplicationEvents4_Event)this.Application).NewDocument +=
new MSWord.ApplicationEvents4_NewDocumentEventHandler(Application_NewDocument);
this.Application.DocumentOpen +=
new MSWord.ApplicationEvents4_DocumentOpenEventHandler(Application_DocumentOpen);
}
正如我对Deni的回答所说: 在ThisAddIn.Desiger.cs中设置DocumentOpen事件处理程序的Initialize()方法适用于现有文档,但是当Word打开时,不会为初始化的新文档调用NewDocument,因此此解决方案不起作用。所以我将DocumentOpen和NewDocument的设置保留在ThisAddIn_Startup事件中,否则当文档加载Word时将触发DocumentOpen。
答案 2 :(得分:1)
我在启动处理程序中使用了Application.Documents集合来查找加载项加载之前存在的所有文档。它完成了你的答案所做的同样的事情,而且,如果你因为任何原因随后按需加载加载项(而不是在Word启动时加载),枚举集合可以获得的不仅仅是活动文档。
只要ActiveDocument发生更改,就会触发DocumentChange()事件。 Word一次只有一个活动文档。在多个打开的Word文档之间切换将触发事件。此外,关闭文档时,事件可能会在另一个打开的文档变为活动状态时触发。它也会在最后一个文档关闭后触发,在这种情况下,Application.ActiveDocument将无效。