WPF 弹出窗口的替代方案

11

我有一个窗口和一个弹出窗口,当在列表视图中双击项目时会弹出该窗口。
它居中于主窗口并且看起来漂浮在那里非常好看。
问题是,当用户移动主窗口或选择其他程序时,弹出窗口就会浮在其他东西的上面。

我希望有类似于弹出窗口的东西,即它会浮在窗口中的其他元素上方,但随着主窗口的移动(保持居中)而移动,并且不会浮在其他程序的上方。
我能让弹出窗口像这样运作吗?还是有更好的方法来实现?


它是在VB.Net 2010中,我不认为Popup有.Owner属性,如果我尝试设置Window.GetWindow(Me).Owner = Application.Current.MainWindow,我会收到一个错误,说“无法将Owner属性设置为自身。”所以我不确定如何正确地做这件事。 - AndyD273
1
由于这是谷歌搜索“wpf popup floats over other applications”的热门结果。如果您想出于其他原因使用弹出窗口,我只想放一个链接到https://dev59.com/enHYa4cB1Zd3GeqPNZs3 - Morten
太棒了,谢谢你的提示。 - AndyD273
4个回答

5
弹出窗口和上下文菜单在调整窗口大小或移动时不会移动。因为弹出窗口/上下文菜单不是可视树的一部分。你需要使用Adorner来解决这个问题。我建议阅读这个四部分系列文章,快速入门Adorner。

你知道是否可以在元素之后应用Adorner吗?我试图使这个程序非常模块化,因此弹出popup的listview是自定义用户控件的一部分,该控件嵌入在页面中,该页面位于窗口上的导航框架中。我希望只需将Adorner代码放在用户控件内并告诉它附加到窗口即可。我可以将其附加到用户控件,但我希望将其居中在窗口中。 - AndyD273

3

在这种情况下,可能一个 装饰器 比弹出窗口更适合您的需求。装饰器也可以浮动在您的窗口上方。它们有一些不同之处,主要是装饰器绑定到 UIElement(包括窗口)。


您知道是否可以事后将装饰者应用于元素?我正在尝试使此程序非常模块化,因此弹出弹出窗口的listview是自定义用户控件的一部分,该控件嵌入在页面中,该页面位于窗口上的导航框架内。我希望只需将Adorner代码放入用户控件中并告诉它附加到窗口即可。我可以将其附加到用户控件,但我希望将其居中在窗口中。 - AndyD273
是的,它们可以像弹出窗口一样在运行时添加和移除。例如,我编写了自己的DataGrid,并使用Adorner作为单元格编辑窗口。确保您的窗口具有一个AdornerLayer(我建议在Xaml中添加一个),您就可以轻松地将adorner居中在其中。 - Ed Bayiates
有没有好的资源来解释这个过程?显然,“AdornerLayer”非常模糊,没有很多关于如何最好地使用它的好例子。大多数示例都是“在文本框的角落上放一个点”,并涉及编写每个类。当这样做时,我可能会有十几个“弹出式”控件,大多包含自定义用户控件,如果可以的话,我希望不必为每个控件编写特定的类。弹出窗口很容易使用,可以在XAML中设计并根据需要显示。具有此类简单创建功能的装饰器控件将是很棒的。 - AndyD273
通常我会在窗口或顶层网格中添加<AdornerLayer>,以确保存在一个。但在某些情况下,例如当我在对话框中使用控件时,该层不会出现。 - Ed Bayiates

2
如果您愿意使用第三方/开源(MS-PL)选项,Extended WPF Toolkit有一个ChildWindow控件

从技术上讲,它不是一个单独的窗口,但对用户来说它看起来像是一个单独的窗口。


0

我还没有找到一种方法来阻止 WPF 中的弹出窗口这样做。

作为替代方案,您可以创建一个类似于弹出窗口的 UserControl。

通常情况下,我会将应用程序的内容部分与弹出窗口一起托管在 Canvas 控件中,当 IsPopupOpen 更改为 True 时,我将弹出窗口的 Visibility 设置为 Visible。


这可能是一个可行的方法,但我仍然不确定最佳的实现方式。ListView位于CustomUserControl中,在Page内部,在Navigation Frame内部,在Window内部(这并不是主窗口,以防会让事情变得更简单)。 - AndyD273
我可以在页面中添加一个画布,但我不确定如何从用户控件中传递打开它的命令。 - AndyD273
@AndyD273 我会将弹出窗口添加到您的顶部控件(在这种情况下是 Window),并在您的 ViewModel 中设置一个名为 IsPopupOpen 的属性。然后,我会设置一个事件监听器来监听 ShowPopupEvent 事件,并在该事件被触发时显示弹出窗口。您还可以将弹出窗口内容作为 ShowPopupEvent 参数之一传递。 - Rachel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接