6

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

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

  5. 另一个问题,我试图在根主窗体(即 Windows 窗体)被停用(按 Alt+Tab)时关闭弹出窗口,但即使我在弹出窗口中进入 windowshostControl 中的控件之一,也会触发此事件(停用)。

期望的行为:

  1. 应该能够在 wpf 弹出窗口中托管并与 winform 控件交互。
  2. 在弹出区域之外单击时,弹出窗口应该关闭。

感谢任何输入。

谢谢。

4

2 回答 2

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从那一刻起, 它的工作原理与正常情况几乎相同。

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

于 2009-12-09T17:44:47.877 回答
0

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

查看我的问题为什么我的 WPF 文本框“有点”只读?.

根据 Doug 所说的弹出窗口是一个有自己的句柄的窗口,公正的存在使得这适用。

于 2009-12-14T13:37:52.743 回答