У меня есть надстройка VSTO Excel, где я хочу записывать изменения в лист с помощью обработчика событий Workbook.SheetChange.
Моя надстройка открывает окна WPF с помощью кнопок ленты, чтобы взаимодействовать с пользователем и выполнять функции на листе. Я обнаружил, что после открытия окна WPF мой обработчик событий SheetChange больше не срабатывает.
Я создал простую надстройку для тестирования, чтобы оценить различные варианты использования, и сузил проблему до того, чтобы что-то делать с окном WPF.
В частности, когда окно активируется во второй раз или когда срабатывает событие GotFocus.
Проблема также возникает независимо от того, запускается ли новое окно (WPF или Форма) из основного потока или из фонового потока
Когда я запускаю те же тесты для окна формы Windows, проблема не возникает, и событие SheetChange срабатывает правильно.
Рабочий вариант использования
- Начните с пустой книги
- Нажмите «Установить дескриптор книги», нажмите «ОК» в окне сообщений
- Изменить значение ячейки на листе
- Вы должны увидеть обновление ячейки A1 с событием: 1, счетчик должен вести учет того, сколько раз событие сработало
- Теперь нажмите «Показать форму STA»
- Тест A - обновит 5 ячеек на листе, поэтому счетчик должен увеличиться на 5
- Текст B - обновит одну ячейку, счетчик должен увеличиваться на 1 при каждом нажатии
- Закройте форму, измените значение другой ячейки на листе, счетчик должен увеличиться на 1
- Повторите тест, но нажмите «Показать форму MT»
- Вы должны заметить, что событие SheetChange вызывается последовательно при каждом обновлении ячейки.
Неудачный вариант использования
- Начните с пустой книги
- Нажмите «Установить дескриптор книги», нажмите «ОК» в окне сообщений
- Изменить значение ячейки на листе
- Вы должны увидеть обновление ячейки A1 с событием: 1, счетчик должен вести учет того, сколько раз событие сработало
- Теперь нажмите «Показать окно STA WPF»
- Когда окно загружается, ACTIVATED показывает 0
а. Примечание. Если окно перемещается в этот момент, событие не запускается даже без нажатия каких-либо кнопок.
б. Примечание. Тест также не пройден, если пользователь щелкнет в окне (например, в пустой области между двумя кнопками)
- Нажмите Тест A - это обновит 5 ячеек на листе, поэтому счетчик должен увеличиться на 5. В таком случае.
- Click Test B - Это обновит одну ячейку, счетчик должен увеличиваться на 1 при каждом нажатии. Этого не происходит! Обратите внимание, что статус теперь показывает FOCUS 0
- После этого момента событие SheetChange больше не запускается, независимо от того, что
- Этот тест можно повторить с помощью «Show STA WPF Dialog» и «Show MT WPF Window» с одинаковыми результатами
Интересное открытие
1. После того, как событие SheetChange больше не срабатывает после выполнения вышеуказанных тестов, если я перерегистрирую событие SheetChange, снова щелкнув Set Book Handle. Вышеупомянутые тесты теперь проходят, и я не могу воспроизвести исходную проблему, используя Windows WPF.
2. Кнопка «Обойти» пытается «прервать» событие, а затем перерегистрировать его, пытаясь обойти проблему ... Что не работает
Может кто-нибудь объяснить, что происходит или помочь решить проблему?