Как закрыть всплывающие окна, используемые как подменю в WPF

У меня есть кнопка, которая при нажатии открывает всплывающее окно. Всплывающее окно - это подменю, содержащее больше кнопок. При нажатии одной из кнопок в подменю всплывающее окно закрывается. Я также хочу, чтобы всплывающее окно закрывалось, когда пользователь щелкает где-то за пределами всплывающего окна. Также важно отметить, что большую часть экрана занимает WindowsFormsHost, который отображает элемент управления OpenGL Win Forms.

Я смог закрыть всплывающее окно при нажатии кнопки подменю. В обработчике кликов для этих кнопок я закрываю Popup. Однако закрытие всплывающего окна при нажатии в другом месте - вот где я столкнулся с проблемой.

Вещи, которые я пробовал:

Установка PopUp.StaysOpen на false. Это работает так, что при нажатии в другом месте экрана всплывающее окно закрывается. Однако в элементе управления Win Forms, похоже, требуется щелчок, чтобы закрыть всплывающее окно, а затем второй щелчок, чтобы выполнить какое-либо действие. Это очень нежелательно.

Я попытался обработать событие LostFocus для кнопки, открывающей всплывающее окно, и установил для параметра StaysOpen значение true. Это работает в том смысле, что нажатие на всплывающее окно не требует второго щелчка на элементе управления Win Forms. Теперь проблема в том, что событие LostFocus обрабатывается и всплывающее окно закрывается до того, как оно прочитает щелчок по любой кнопке во всплывающем окне. Это делает подменю непригодным для использования.


person Dan Vogel    schedule 15.05.2009    source источник


Ответы (1)


Вероятно, есть какая-то проблема с системой фокусировки WPF. WPF имеет собственную систему фокуса, которая полностью отделена от WinForms и стандартных окон Win32.

Я уверен, что при переключении фокуса между WinForms и WPF есть некоторые события, которые не запускаются должным образом.

Предлагаемое исправление - переопределить событие WndProc или Click вашего окна WinForms и вручную установить для IsOpen значение false во всплывающем окне.

Я ожидал, что это единственное, что это исправит.

person jonathanpeppers    schedule 31.08.2009