Мы разработали надстройку Word VSTO для Word 2010 с CustomTaskPanes и поддержкой MVVM через VSTOContrib. < br> После обновления до 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 для разрешения представления "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 для целей тестирования лучше не становится.
Я не нашел никаких вариантов Word, которые могли бы вызвать это. Есть идеи, что это может вызвать и как это исправить / получить обходной путь?
ИЗМЕНИТЬ
Вот обновленный пример кода WordTaskPanesBug < / а>
Действия по воспроизведению:
- Запустить Word / запустить проект
- Нажмите кнопку "Открыть"
- Нажмите кнопку «Новый документ».
- Нажмите кнопку «Новый документ», откроется панель задач (но на этот раз не произойдет сбой).
Также CustomTaskPane дает сбой при закрытии документа в примере проекта, но не в нашем реальном проекте.