WPF Popup和WindowsFormsHost问题

时间:2009-07-27 00:41:32

标签: wpf popup windowsformshost

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

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

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

  6. 所需行为:

    1. 应该能够在wpf弹出窗口中托管和交互winform控件。
    2. 点击弹出区域外,弹出窗口应该关闭。
    3. 感谢任何输入。

      感谢。

2 个答案:

答案 0 :(得分:2)

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

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

PopupDecorator.csTimeoutPopupDecorator.cs

使用非常简单:

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

    的xmlns:dday_wpf = “CLR-名称空间:DDay.WPF”

  2. 围绕您希望弹出窗口能够与装饰器一起显示的区域。即。

    < dday_wpf:PopupDecorator x:Name =“popup”>     < dday_wpf:PopupDecorator.Popup>         ... popup的内容在这里...     < / dday_wpf:PopupDecorator.Popup>     ...小组的内容到这里... < / dday_wpf:PopupDecorator>

  3. 从那一刻起,它与普通Popup几乎完全相同。

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

答案 1 :(得分:0)

这听起来有点像我从WPF表单启动无模式winform控件的问题。

查看我的问题Why is my WPF textbox "kinda" readonly?

根据道格所说的关于弹出窗口是一个有自己手柄的窗口,正确的存在使这适用。