6

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

3 回答 3

2

链接将为您提供帮助,基本上他们所说的是 ThisAddIn_Startup在DocumentOpen 事件完成运行后运行还有一个解决该问题的方法,只需点击超链接即可。

于 2012-10-02T08:04:24.027 回答
2

所以我最终在 ThisAddIn_Startup 中处理了加载的文档。如果文档的 Path 是一个空字符串,那么我们就知道该文档是新的,并且从未保存在本地机器上。否则,我知道它已保存(包括在临时目录中)并且我将其作为现有文档处理。

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 的 Initialize() 方法中设置 DocumentOpen 事件处理程序适用于现有文档,但在 Word 打开时初始化的新文档不会调用 NewDocument,因此此解决方案不起作用。所以我在 ThisAddIn_Startup 事件中保留了 DocumentOpen 和 NewDocument 的设置,否则 DocumentOpen 也会在使用 Word 加载文档时被触发。

于 2012-10-02T19:16:15.440 回答
1

我已经使用 Startup 处理程序中的 Application.Documents 集合来查找加载项加载之前存在的所有文档。它完成了与您的答案相同的事情,此外,如果您稍后(而不是在 Word 启动时)出于任何原因按需加载加载项,则枚举集合不仅可以获得活动文档。

每当 ActiveDocument 更改时,就会触发 DocumentChange() 事件。Word 一次只有一个活动文档。在多个打开的 Word 文档之间切换将触发该事件。此外,当关闭文档时,该事件可能会在另一个打开的文档变为活动状态时触发。它也会在最后一个文档关闭后触发,在这种情况下,Application.ActiveDocument 将无效。

于 2015-02-04T18:12:05.367 回答