C# VSTO加载项CustomTaskPane在升级到Word 2016/2019后自动打开

C# VSTO加载项CustomTaskPane在升级到Word 2016/2019后自动打开,c#,mvvm,ms-word,vsto,customtaskpane,C#,Mvvm,Ms Word,Vsto,Customtaskpane,我们已经为Word 2010开发了一个Word VSTO附加模块,通过提供CustomTaskPanes和MVVM支持。 升级到Word 2016/2019后,我们的CustomTaskPanes会随机显示,用户不会执行任何操作。 似乎Word会注意到何时使用了CustomTaskPane,并希望下次自动(重新)打开它 例如,打开新文档/现有文档时会打开CustomTaskPane。如果它不出现故障(打开,关闭,打开,关闭,…),直到它关闭或保持打开状态,就不会那么糟糕。 如果CustomTas

我们已经为Word 2010开发了一个Word VSTO附加模块,通过提供CustomTaskPanes和MVVM支持。
升级到Word 2016/2019后,我们的CustomTaskPanes会随机显示,用户不会执行任何操作。 似乎Word会注意到何时使用了CustomTaskPane,并希望下次自动(重新)打开它

例如,打开新文档/现有文档时会打开CustomTaskPane。如果它不出现故障(打开,关闭,打开,关闭,…),直到它关闭或保持打开状态,就不会那么糟糕。 如果CustomTaskPane保持打开状态,它将不可用,因为它没有外接程序加载的DataContext

此插件中的此代码创建/删除CustomTaskPanes:

public CustomTaskPane AddTaskPane(UserControl userControl, string title, Window owner)
{
    return CustomTaskPanes.Add(userControl, title, owner);
}

public void RemoveTaskPane(CustomTaskPane taskPane)
{
    if (taskPane == null)
        return;

    CustomTaskPanes.Remove(taskPane);
}
RibbonViewModel(每个文档/窗口的ViewModel)调用如下代码。
\u addInHelper
具有用于创建/删除CustomTaskPane的事件,以到达
此addin
代码,并通过回调返回CustomTaskPane实例。它还使用IoC容器解析视图
“CustomTaskPaneView”

关闭窗口/文档时,调用此代码:

public override void Cleanup()
{
    if (_customTaskPane != null)
    {
        SaveCustomTaskPaneProperties();

        _contentControlsTaskPane.VisibleChanged -= ContentControlsTaskPane_OnVisibleChanged;
        _contentControlsTaskPane.DockPositionChanged -= ContentControlsTaskPane_OnDockPositionChanged;

        // Checks if the COM Object was cleaned up already
        if (!_contentControlsTaskPane.IsDisposed())
        {
            // Tried to manually close the CustomTaskPane, but didn't help either
            if (_contentControlsTaskPane.Visible)
                _contentControlsTaskPane.Visible = false;

            // Cleanup the CustomTaskPane ViewModel instance
            var taskPaneViewModel = _contentControlsTaskPane.GetViewModel();
            taskPaneViewModel?.Dispose();

            _addInHelper.RemoveTaskPane(_contentControlsTaskPane);
        }
    }
}
这只发生在使用Word 2016和2019时(我们不使用2013),而Word 2010根本没有发生。 在2013年和2016年为了测试目的将VSTO项目升级为VSTO Add之后,情况并没有好转

示例:

我没有找到任何可能导致这种情况的单词选项。 你知道这会导致什么,以及如何解决这个问题/找到解决办法吗


编辑
下面是更新后的代码示例

复制步骤:

  • 启动Word/run项目
  • 点击“打开”按钮
  • 单击“新建文档”按钮
  • 单击“新建文档”按钮,任务窗格打开(但这次不会出现故障)
  • 在示例项目中关闭文档时,CustomTaskPane也会出现故障,但在实际项目中不会


    我添加了索引以指示正在显示的任务窗格,这表明第二次创建新文档时添加的任务窗格来自第一个文档(第一次创建新文档时关闭的任务窗格,可能是因为它是空的)


    我认为您遇到的问题是这样的:

    这是在加载项为空的情况下发生的,还是在任务窗格为空的情况下发生的?你可能需要朝着一个目标努力,除非你发布的内容已经是这样了。@Chris我用复制的Bug添加了一个MVCE,我在2013年尝试了它,它似乎也做了同样的事情,但在第5步,你的gif也显示了这一点。关闭时我看不到任何问题。但是您的项目有多个第三方库、一个二进制资源和一个复杂的流程,以至于看起来不像MVCE。如果这真的是重现问题的最低要求,那么您的问题可能不是VSTO API,而是VSTOContrib、Prism或Unity,我对它们了解得不够,无法说明发生了什么。@Chris组合/程序结构可能会导致小故障和关闭错误。但我不认为Prism(除了ViewModel绑定之外我没有使用它)和Unity(只是IoC创建/传递对象)在这方面起到很大作用。不管怎样,我删除了所有依赖项,并减少了所有我可以从repo中得到的代码,并且开始的bug仍然存在。我加入了
    test.docx
    资源,以便能够快速打开同一文档。也许你可以再看看?谢谢你的建议。
    public override void Cleanup()
    {
        if (_customTaskPane != null)
        {
            SaveCustomTaskPaneProperties();
    
            _contentControlsTaskPane.VisibleChanged -= ContentControlsTaskPane_OnVisibleChanged;
            _contentControlsTaskPane.DockPositionChanged -= ContentControlsTaskPane_OnDockPositionChanged;
    
            // Checks if the COM Object was cleaned up already
            if (!_contentControlsTaskPane.IsDisposed())
            {
                // Tried to manually close the CustomTaskPane, but didn't help either
                if (_contentControlsTaskPane.Visible)
                    _contentControlsTaskPane.Visible = false;
    
                // Cleanup the CustomTaskPane ViewModel instance
                var taskPaneViewModel = _contentControlsTaskPane.GetViewModel();
                taskPaneViewModel?.Dispose();
    
                _addInHelper.RemoveTaskPane(_contentControlsTaskPane);
            }
        }
    }