C# VSTO加载项CustomTaskPane在升级到Word 2016/2019后自动打开
我们已经为Word 2010开发了一个Word VSTO附加模块,通过提供CustomTaskPanes和MVVM支持。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 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之后,情况并没有好转
示例:我没有找到任何可能导致这种情况的单词选项。 你知道这会导致什么,以及如何解决这个问题/找到解决办法吗
编辑
下面是更新后的代码示例 复制步骤:
我添加了索引以指示正在显示的任务窗格,这表明第二次创建新文档时添加的任务窗格来自第一个文档(第一次创建新文档时关闭的任务窗格,可能是因为它是空的)
我认为您遇到的问题是这样的:这是在加载项为空的情况下发生的,还是在任务窗格为空的情况下发生的?你可能需要朝着一个目标努力,除非你发布的内容已经是这样了。@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);
}
}
}