如何处理Word DocumentChange事件,因为在加载时不会触发NewDocument事件

时间:2012-10-01 20:18:44

标签: c# .net events ms-word add-in

首次加载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?
}

3 个答案:

答案 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将无效。