【问题标题】:VSTO Word add-in - new document event not firing if Word is launched from the executableVSTO Word 加载项 - 如果从可执行文件启动 Word,则不会触发新文档事件
【发布时间】:2014-05-12 00:38:57
【问题描述】:

在我的加载项中,我需要为每个打开的文档创建一个任务窗格。在加载项的启动方法中,我订阅了 ApplicationEvents4_Event.NewDocument 和 Application.DocumentOpen 事件,然后为每个打开的文档创建一个任务窗格:

((ApplicationEvents4_Event)Application).NewDocument += CreateTaskPaneWrapper;
Application.DocumentOpen += CreateTaskPaneWrapper;

foreach (Document document in Application.Documents)
{
    CreateTaskPaneWrapper(document);
}

这包括通过 Word 的菜单打开或创建文档,或在操作系统中打开现有文档文件的情况。但是,如果 Word 已经打开,则启动 WINWORD.EXE(或通过快捷方式访问它,这是一种非常常见的情况)不会触发任何一个事件,尽管打开了一个带有新文档的新窗口。我如何应对这种情况并为以这种方式创建的文档创建任务窗格?我正在使用针对 Word 2007 的 VSTO 3 和 Visual Studio 2008。

【问题讨论】:

  • 我正在与非常相似的事情作斗争。您是否有机会展示一些用于订阅 ApplicationEvents4Events 处理程序的附加代码?
  • @StevenDAmico 我在这里转储了一些代码:pastebin.com/CRZmpBg5。我剪掉了一些特定于产品的代码,cmet 被匆忙翻译成英文,但除此之外它是完整的。代码来自两个不同的文件。我无法找到这个问题的正确解决方案,因此在我的插件中,如果用户单击插件功能区按钮,将创建缺少的任务窗格。另外,请查看我关于任务窗格主题的其他 SO 问题:stackoverflow.com/questions/22560441

标签: ms-word vsto add-in office-interop


【解决方案1】:

如果 Word 已启动,则在加载加载项之前会创建一个新文档,因此无法捕获此事件。

如果您需要使用最初创建的文档,只需查看 Documents 集合 - 如果 Count 大于零,则此文档是 Word 在加载您的加载项之前创建的文档。

【讨论】:

    【解决方案2】:

    所以我在我的解决方案中解决了这个问题,虽然我不确定它是否会交叉适用。遗憾的是,我的是 VB.Net,所以可能需要一些翻译。

    首先,我最终没有使用 ApplicationEvents4_Event 而是您可以通过“ThisAddIn”使用其他内置事件触发器

      Private Sub Application_NewDocument(ByVal Doc As Word.Document) Handles Application.NewDocument
            'MsgBox("I opened something")
            myCustomTaskPane = Me.CustomTaskPanes.Add(New MyCustomTaskPaneClass, "TaskPane", Doc.ActiveWindow)
            myCustomTaskPane.Visible = True
        End Sub
    

    使用这种方法,我确实遇到了类似的挑战。运行 winword.exe,从而打开一个新的 word 文档,并没有触发 NewDocument 事件。幸运的是,还有另一个事件可供使用 - 文档更改。

    Private Sub Application_DocumentChange() Handles Application.DocumentChange
        'function to test if the ActiveDocument has a taskpane from my add-in, and then a function to add one        
        If Not HasMyCustomTaskPane() then AddCustomTaskPane()
    End Sub
    

    所以 - 底线是,无论您是否继续使用 ApplicationEvents4_Event,您都应该查看是否可以使用 DocumentChange 事件。选择新单词窗口时触发。

    【讨论】:

    • 谢谢。我最终完全放弃了 ApplicationEvents4_Event.NewDocument 和 Application.DocumentOpen 并改用 Application_DocumentChange。在使用 Application.DocumentOpen 时,无论如何都需要检查活动文档是否存在任务窗格,在某些情况下会触发已打开的文档。
    【解决方案3】:

    在 Word 中处理多个窗口的任务窗格相当复杂,因为 Word 如何加载和重复使用打开的窗口。要正确执行此操作,您必须考虑不同的操作:

    • 用户执行操作以显示或隐藏任务窗格。
    • 用户创建了一个新文档。
    • 用户打开现有文档。
    • 用户关闭一个打开的文档。

    有一个使用 VB 和 C# 探索所有细节的教程:https://msdn.microsoft.com/en-us/library/bb264456%28v=office.12%29.aspx

    我还找到了similar answer on SO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多