Мы разработали надстройку Word VSTO для Word 2010 с поддержкой CustomTaskPanes и поддержкой MVVM через VSTOContrib .
После обновления до 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 Add-In 2013 и 2016 для тестирования он не улучшается.
* * Пример тысяча двадцать-один: * * 1 022
Я не нашел ни одного варианта Word, который мог бы вызвать это.
Любая идея, что это может вызвать и как это исправить / получить обходной путь?
EDIT
Вот обновленный пример кода WordTaskPanesBug
Шаги для воспроизведения:
- Запустить Word / запустить проект
- Нажмите кнопку «Открыть»
- Нажмите кнопку «Новый документ»
- Нажмите кнопку «Новый документ», панель задач откроется (но на этот раз не сработает)
Также CustomTaskPane дает сбой при закрытии документа в примере проекта, но не в нашем реальном проекте.
Старый пример GIF