Excel VSTO AddIn неверные панели задач - PullRequest
0 голосов
/ 28 сентября 2019

В моей надстройке я создаю несколько областей задач, которые при необходимости скрываются / отображаются.

Если пользователь использует функцию, отображающую панель, код проверяет, существует ли панель, и еслиэто принадлежит текущему окну.Если ДА для обоих, отображается панель, если НЕТ для обоих, панель создается, добавляется в коллекцию CustomTaskPanes и отображается.

Если я открываю (с File / New)другое окно Excel (без закрытия первого) и окно должно показывать панель, код снова проверяет, существует ли соответствующая панель и является ли она собственной, если теперь панель создается и отображается.Все работает хорошо.Вот код, который проверяет, принадлежит ли панель текущему окну:

    if (pane != null && pane.Window != null &&
                        ((Microsoft.Office.Interop.Excel.Window)pane.Window).Hwnd 
== Globals.ThisAddIn.Application.ActiveWindow.Hwnd)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }

Но в следующем сценарии происходит сбой приложения:

  1. Открыть Excel, показатьПанель действий пользователя

  2. В меню Файл / Открыть откройте документ Excel.Документ Excel открывается в старом окне, то есть другое окно не создается

  3. Прежде чем я пытаюсь показать панель, я проверяю, существуют ли панели и принадлежат ли они текущему окну,как объяснено выше.

  4. Проблема в том, что панель существует, но ее элемент управления, принадлежащий окну Excel ПЕРЕД открытием второго Excel, удаляется, и я получаю это исключение: "Панель задачбыл удален или больше не действителен. "

Один из способов исправить это - проверить, отменен ли контроль панели, и это решение работает нормально.

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

Проблема в том, что нет события Workbook.Close () , в которомуничтожить эти стекла.Существует событие Workbook.BeforeClose , но оно не запускается, если я открываю существующий документ Excel.Поэтому мой вопрос: как я могу определить, когда окно Excel закрыто / уничтожено?

...