WPF Popup и проблема WindowsFormsHost

Я размещаю элемент управления windowsforms во всплывающем окне WPF. Проблемы ниже:

  1. Если я сделаю StaysOpen = False, я не смогу взаимодействовать с элементом управления winform. Для StaysOpen требуется значение false, потому что при щелчке за пределами области Popup он должен закрываться.
  2. если я сделаю StaysOpen = True, я могу взаимодействовать с элементом управления winform, но когда я щелкаю за пределами области всплывающего окна, он не закрывается.
  3. Я попытался установить StaysOpen = true в MouseEnter всплывающего окна и StaysOpen = False в MouseLeave, но MouseLeave срабатывает, когда и когда мышь находится над элементом управления winform, что приводит к неожиданному поведению.
  4. Я даже попробовал свойство IsMouseCaptureWithin всплывающего окна и обнаружил, что оно не работает с winforms (я думаю, это ошибка в структуре).

  5. Другая проблема: я пытался закрыть всплывающее окно, когда основная корневая форма (которая является формой Windows) деактивирована (нажатие Alt + Tab), но это событие (деактивировать) запускается, даже когда я вхожу в один из элементов управления в windowshostControl во всплывающем окне.

Желаемое поведение:

  1. должен иметь возможность размещать и взаимодействовать с элементом управления winform во всплывающем окне wpf.
  2. при нажатии вне области всплывающего окна всплывающее окно должно закрываться.

Цените любой вклад.

Спасибо.


person Community    schedule 27.07.2009    source источник


Ответы (2)


У меня было много проблем с дефакто стандартными всплывающими окнами в WPF, потому что они фактически представляют собой новое окно со своим собственным дескриптором. Это означает, что если вы перетаскиваете приложение по экрану, всплывающее окно остается на месте (оно не перемещается вместе с вашим окном). Это также означает, что ваше всплывающее окно ведет себя странно и не взаимодействует с вашим приложением так, как обычно это делают другие элементы управления.

Я создал 2 класса декораторов для решения этой проблемы:

PopupDecorator.cs и TimeoutPopupDecorator.cs

Использовать довольно просто:

  1. Добавьте объявление пространства имен для новых всплывающих классов. т.е.

    xmlns: dday_wpf = "пространство имен clr: DDay.WPF"

  2. Окружите область, в которой должно отображаться всплывающее окно, с помощью декоратора. т.е.

    ‹Dday_wpf: PopupDecorator x: Name =" popup ">‹ dday_wpf: PopupDecorator.Popup> ... содержимое всплывающего окна находится здесь ... ‹/dday_wpf:PopupDecorator.Popup> ... содержимое панели находится здесь ...‹ / dday_wpf: PopupDecorator>

С этого момента он работает почти так же, как обычный Popup.

Возможно, это не решит всех ваших проблем, но, надеюсь, поможет.

person Doug    schedule 09.12.2009
comment
Хорошо, я обновил ссылки, чтобы теперь они указывали на правильное местоположение. - person Doug; 30.04.2014

Это немного похоже на мою проблему с запуском немодального элемента управления winform из формы WPF.

Ознакомьтесь с моим вопросом Почему мое текстовое поле WPF доступно только для чтения?.

Само существование, основанное на том, что Дуг сказал о всплывающих окнах, являющихся окном с собственным дескриптором, делает это применимо.

person Russ    schedule 14.12.2009