WPF Popup和WindowsFormsHost问题

6 wpf popup windowsformshost

我在WPF弹出窗口中托管windowsforms控件.问题如下:

  1. 如果我使StaysOpen = False,我无法与winform控件进行交互.StaysOpen为false是必需的,因为当在Popup区域外点击时,它应该关闭.
  2. 如果我使StaysOpen = True我可以与winform控件进行交互但是当我在弹出区域外单击时,它不会被关闭.
  3. 我尝试在MouseEnter的弹出窗口中设置StaysOpen = true,在MouseLeave中设置StaysOpen = False,但是当鼠标悬停在winform控件上时,MouseLeave将触发,从而导致意外行为.
  4. 我甚至尝试过弹出窗口的IsMouseCaptureWithin属性,发现它不适用于winforms(我猜它是框架中的一个bug).

  5. 另一个问题,我试图关闭弹出窗口根主体窗体(这是窗口形式)被取消激活(按Alt + Tab),但这个事件(停用)即使我在弹出窗口中进入windowshostControl中的一个控件时被触发.

期望的行为:

  1. 应该能够在wpf弹出窗口中托管和交互winform控件.
  2. 点击弹出区域外,弹出窗口应该关闭.

感谢任何输入.

谢谢.

Dou*_*oug 2

我在使用 WPF 中事实上的标准弹出窗口时遇到了很多问题,因为它们实际上是一个具有自己句柄的新窗口。这意味着如果您在屏幕上拖动应用程序,弹出窗口将保持不变(它不会随窗口移动)。这也意味着您的弹出窗口有一些奇怪的行为,并且不会像其他控件通常那样与您的应用程序交互。

我创建了 2 个装饰器类来解决这个问题:

PopupDecorator.csTimeoutPopupDecorator.cs

使用起来非常简单:

  1. 为新的弹出类添加命名空间声明。IE

    xmlns:dday_wpf="clr-命名空间:DDay.WPF"

  2. 围绕您希望能够使用装饰器显示弹出窗口的区域。IE

    <dday_wpf:PopupDecorator x:Name="popup"> <dday_wpf:PopupDecorator.Popup> ... 弹出窗口的内容放在这里 ... </dday_wpf:PopupDecorator.Popup> ... 面板的内容放在这里 ... < /dday_wpf:PopupDecorator>

Popup从那一刻起, 它的工作方式与正常情况几乎相同。

这可能无法解决您的所有问题,但希望能有所帮助。