Надстройка VSTO CustomTaskPane открывается после обновления до Word 2016/2019 - PullRequest
1 голос
/ 11 июня 2019

Мы разработали надстройку 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 enter image description here

Я не нашел ни одного варианта Word, который мог бы вызвать это. Любая идея, что это может вызвать и как это исправить / получить обходной путь?


EDIT
Вот обновленный пример кода WordTaskPanesBug

Шаги для воспроизведения:

  1. Запустить Word / запустить проект
  2. Нажмите кнопку «Открыть»
  3. Нажмите кнопку «Новый документ»
  4. Нажмите кнопку «Новый документ», панель задач откроется (но на этот раз не сработает)

Также CustomTaskPane дает сбой при закрытии документа в примере проекта, но не в нашем реальном проекте.

Старый пример GIF

example gif

1 Ответ

2 голосов
/ 14 июня 2019

Я добавил индексы, чтобы указать, какая область задач отображается, что показывало, что область задач, добавляемая при создании нового документа во второй раз, из первого документа (той, которая закрывается при создании нового документа дляв первый раз, вероятно, потому что он пуст).

Я думаю, что проблема, с которой вы столкнулись, заключается в следующем: Создание и управление настраиваемыми областями задач для нескольких документов в надстройке Word VSTO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...