gpt4 book ai didi

ms-word - 在 VSTO Word 插件中创建和管理多个文档的自定义任务 Pane

转载 作者:行者123 更新时间:2023-12-03 01:33:58 31 4
gpt4 key购买 nike

我正在 Visual Studio 2008 中使用 VSTO 开发 Word 2007-2010 插件。在我的插件中,我需要为每个打开的 Word 文档提供一个自定义任务 Pane 。基本上,我需要为每个文档创建一个任务 Pane ,在文档窗口中显示正确的任务 Pane ,在文档关闭时执行某些操作,然后删除任务 Pane 及其所有引用。

这是我到目前为止所做的:

创建任务 Pane

我为每个新的、打开的或现有的加载文档创建一个自定义任务 Pane ,如下所示:

((ApplicationEvents4_Event) Application).NewDocument += CreateTaskPaneWrapper;
Application.DocumentOpen += CreateTaskPaneWrapper;
foreach (Document document in Application.Documents)
{
CreateTaskPaneWrapper(document);
}

在 CreateTaskPaneWrapper 方法中,我检查 Dictionary 文档的任务 Pane 是否已存在。我这样做是因为如果我尝试打开一个已经打开的文档,则会触发 open 事件。如果它不存在,我将创建一个新的 TaskPaneWrapper 类。在其构造函数中,我创建一个新的任务 Pane 并将其添加到 CustomTaskPanes 集合中

Globals.ThisAddIn.CustomTaskPanes.Add(taskPane, "Title");

According to MSDN ,这会将任务 Pane 与当前事件窗口关联起来。

任务 Pane 关闭

Document.Close 和 Application.DocumentBeforeClose 事件都不适合我,因为它们在用户确认关闭文档之前触发。因此,我在 TaskPaneWrapper 类中使用 Microsoft.Office.Tools.Word.Document.Shutdown 事件,如下所示:

_vstoDocument = document.GetVstoObject();
_vstoDocument.Shutdown += OnShutdown;

private void OnShutdown(object sender, EventArgs eventArgs)
{
Globals.ThisAddIn.CustomTaskPanes.Remove(_taskPane);
//additional shutdown logic
}

所有这些似乎都工作得很好,任务 Pane 已创建,绑定(bind)到相应的窗口,并成功删除。但是,我仍然遇到一个问题 - 当我启动 Word 时,会打开一个空白文档。如果我随后打开现有文档而不更改空白文档,则空白文档及其窗口将被删除,而不会触发 Document.Close、Application.DocumentBeforeClose 和 Microsoft.Office.Tools.Word.Document.Shutdown 事件。由于未调用 OnShutdown 并且未删除空白文档的任务 Pane ,因此下一个文档窗口包含两个任务 Pane - 非常新的任务 Pane 和第一个(孤立的)任务 Pane 。如何删除这个孤立的任务 Pane ?访问已删除的文档或窗口引用会引发 COMException(“对象已删除”)。我暂时使用这个黑客:

//A property in my TaskPaneWrapper class
public bool IsWindowAlive()
{
try
{
var window = _vstoDocument.ActiveWindow;
return true;
}
catch (COMException)
{
return false;
}
}

在 CreateTaskPaneWrapper 方法中,我检查所有现有包装器的此属性,并关闭该属性为 false 的包装器。当然,捕获异常有点昂贵,而且这个解决方案非常老套,所以我想知道,是否有更好的解决方案? In this question检查 CustomTaskPane.Window 属性是否为 null,但它永远不会为我返回 null。

此外,使用我当前的逻辑还会遇到其他问题吗?管理多个文档的多个任务 Pane 的典型方法是什么?

最佳答案

此问题在题为 Managing Task Panes in Multiple Word and InfoPath Documents 的 MSDN 文章中有详细介绍

您必须创建一个方法来删除孤立的 CTP(即那些不再附加窗口的 CTP)。

我按照这篇文章成功实现了一个删除孤儿的 CustomTaskPane 管理器。

关于ms-word - 在 VSTO Word 插件中创建和管理多个文档的自定义任务 Pane ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22560441/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com