Nano Hash - криптовалюты, майнинг, программирование

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

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

Действия по воспроизведению:

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

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

Старый пример гифки

пример gif


  • Это происходит с пустой надстройкой или только с пустой панелью задач? Вероятно, вам нужно работать над MVCE, если только то, что вы опубликовали, уже не является таковым. 11.06.2019
  • @Chris Я добавил MVCE с воспроизведенной ошибкой 12.06.2019
  • Я пробовал это в 2013 году, и, похоже, он делает то же самое, но на шаге 5, который также показывает ваш гиф. При закрытии проблем не вижу. Но в вашем проекте есть несколько сторонних библиотек, двоичный ресурс и сложный поток до такой степени, что он не похож на MVCE. Если это действительно минимум, необходимый для воспроизведения проблемы, ваша проблема, вероятно, не в VSTO API, а в VSTOContrib, Prism или Unity, и я недостаточно знаю о них, чтобы сказать, что происходит. 12.06.2019
  • @Chris Структура комбинации / программы, вероятно, могла вызвать сбои и ошибку закрытия. Но я не думаю, что Prism (которую я не использовал, кроме привязки ViewModel) и Unity (просто IoC, создающий / передающий объекты) действительно играют в этом большую роль. В любом случае я удалил все зависимости и сократил весь код, который мог из репо, и ошибка открытия все еще существует. Я включил ресурсtest.docx, чтобы иметь возможность быстро открыть тот же документ. Может, ты мог бы взглянуть еще раз? Спасибо за совет. 14.06.2019

Ответы:


1

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

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

14.06.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..