gpt4 book ai didi

c# - VSTO加载项CustomTaskPane升级到Word 2016/2019后将自行打开

转载 作者:行者123 更新时间:2023-12-03 10:25:35 25 4
gpt4 key购买 nike

我们已经开发了适用于Word 2010的Word VSTO加载项,并通过VSTOContrib提供了CustomTaskPanes和MVVM支持。
升级到Word 2016/2019后,我们的CustomTaskPanes会随机显示,而无需用户采取任何行动。
好像Word注意到何时使用CustomTaskPane并希望下次自动(重新)打开它。

例如,在打开新/现有文档时,将打开一个CustomTaskPane。如果它在关闭或保持打开之前不会出现故障(打开,关闭,打开,关闭...),那将不是那么糟糕。
如果CustomTaskPane保持打开状态,则将无法使用,因为它没有我们的加载项加载的DataContext。

ThisAddIn中的此代码创建/删除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)将这样调用代码。 _addInHelper具有事件,这些事件用于创建/删除CustomTaskPanes以到达 ThisAddIn代码,并通过回调返回CustomTaskPane实例。它还使用IoC容器解析 View "CustomTaskPaneView"
// Gets called when a new Window opens or a new Document is opened
public override void Intialize(Document document)
{
// ...
CreateCustomTaskPane();
// ...
}

private void CreateCustomTaskPane()
{
if (_customTaskPane != null)
return;

_addInHelper.AddTaskPane("CustomTaskPaneView", "Custom headline", CurrentWindow, result =>
{
_customTaskPane = result;
});

if (_customTaskPane == null)
{
_log.Error(...);
return;
}

_customTaskPane.DockPositionRestrict = MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoHorizontal;
_customTaskPane.Width = Settings.Default.TaskPaneWidth;
_customTaskPane.DockPosition = Settings.Default.TaskPanePosition;

// TaskPane height and width are saved seperately for DockPositionFloating
if (_customTaskPane.DockPosition != MsoCTPDockPosition.msoCTPDockPositionFloating)
{
// Set height and width for DockPositionFloating.
// If the user drags the TaskPane to Floating, it will have the correct size.
var oldDockPosition = _customTaskPane.DockPosition;

_customTaskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionFloating;
_customTaskPane.Height = Settings.Default.TaskPaneHeight;
_customTaskPane.Width = Settings.Default.TaskPaneWidth;
_customTaskPane.DockPosition = oldDockPosition;
}
else
{
_customTaskPane.Height = Settings.Default.TaskPaneHeight;
_customTaskPane.Width = Settings.Default.TaskPaneWidth;
}

// Saving/updating settings in these
_customTaskPane.VisibleChanged += ContentControlsTaskPane_OnVisibleChanged;
_customTaskPane.DockPositionChanged += ContentControlsTaskPane_OnDockPositionChanged;
}

关闭窗口/文档时,此代码称为:
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中根本没有发生。
将VSTO项目升级到VSTO加载项2013和2016以进行测试后,情况并没有得到改善。

例子:
enter image description here

我没有找到任何可能导致此问题的Word选项。
任何想法这可能会导致什么,以及如何解决此问题/解决方法?

编辑
这是 ,它是更新后的代码示例 WordTaskPanesBug

重现步骤:
  • 启动Word/运行项目
  • 单击“打开”按钮
  • 单击“新建文档”按钮
  • 单击“新建文档”按钮,TaskPane被打开(但这次不会出现故障)

  • 同样,在示例项目中关闭文档时,CustomTaskPane也会出现故障,但在我们的实际项目中则不会。

    Old example gif

    example gif

    最佳答案

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

    我认为您遇到的问题是这个:Creating and managing custom task panes for multiple documents in a VSTO Word addin

    关于c# - VSTO加载项CustomTaskPane升级到Word 2016/2019后将自行打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56545132/

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