2011-07-05 148 views
7

我有一个弹出窗口,当双击列表视图中的项目时弹出。
它以主窗口为中心,看起来非常漂亮。
问题是当用户移动主窗口或选择另一个程序时,弹出窗口浮在其他东西之上。WPF弹出窗口替代

我想要一个类似弹出窗口的东西,这意味着它漂浮在窗口中的其他元素之上,但在主窗口移动时保持居中,并且不漂浮在其他顶部程式。
我可以做出这样的弹出式动作,还是有更好的方法来做到这一点?

+0

这是在VB.Net 2010年,并不认为Popup具有.Owner作为属性,如果我尝试设置'Window.GetWindow(Me).Owner = Application.Current.MainWindow'我得到一个错误,说'无法将所有者属性设置为自己。因此,我不确定如何正确执行此操作。 – AndyD273

+1

由于这是“wpf弹出窗口超越其他应用程序”的Google热门游戏。如果你想使用其他原因的弹出窗口,我只想删除链接到http://stackoverflow.com/questions/16316139/popup-doesnt-lose-focus-and-close-until-ive-clicked-a -control-in-it – Morten

+0

真棒,感谢您的提示 – AndyD273

回答

3

在这种情况下,您可能比弹出式窗口更适合您的需求Adorner。装饰者也可以漂浮在窗户上方。有一些差异,主要是装饰者必须与UIElement(包括窗口)绑定。

+0

你知道在事实之后是否可以将元素应用于元素吗?我试图让这个程序非常模块化,所以弹出弹出窗口的列表视图是自定义用户控件的一部分,该控件嵌入页面中,该页面位于窗口中的导航框架内。我想这样做是为了让我所要做的就是将Adorner代码放在用户控件中,并告诉它附加到窗口。我可以将它附加到用户控件上,但我希望将它集中在窗口中。 – AndyD273

+0

是的,他们可以像弹出窗口一样快速添加和删除。例如,我编写了自己的DataGrid,并使用Adorner作为单元格的编辑窗口。确保你的窗口有一个AdornerLayer(我建议在你的Xaml中添加一个),并且你可以很容易地将装饰者置于其中。 –

+0

解释过程的任何好资源?显然“AdornerLayer”非常含糊,没有很多好的例子来说明它的最佳使用方式。大多数例子都是“在文本框的一角放一个点”,并且为每一个类写一个类。完成后,我可能会有十几个“弹出”式控件,大部分都包含一个自定义的用户控件,如果能够帮助它,我宁愿不必为每个控件都编写一个特定的类。弹出窗口非常易于使用,能够在XAML中进行设计并根据需要进行显示。这种简单创作的装饰者控制将会非常棒。 – AndyD273

0

我还没有找到一种方法,使弹出窗口停止这样做在WPF

作为替代方案,您可以创建就像一个弹出一个用户控件。

通常,我在Canvas控件中将应用程序的内容部分与Popup一起托管,并且当IsPopupOpen变为True时,我将弹出窗口Visibility = Visible。

+0

这可能是要走的路,但我仍然不确定最好的方式来做到这一点。 ListView位于页面内的CustomUserControl中,位于导航框内,位于窗口内部(不是主窗口,以防更容易) – AndyD273

+0

我可以向页面添加一个Canvas, m不知道如何冒泡命令从UserControl中打开它 – AndyD273

+0

@ AndyD273我会将弹出窗口添加到顶层控件(在本例中为Window),并在ViewModel中有一个属性“IsPopupOpen”。然后,我会设置一个Event侦听器来侦听ShowPopupEvent,并在引发该事件时显示弹出窗口。您也可以将弹出内容作为ShowPopupEvent参数的一部分传入。 – Rachel

3

窗口大小调整或移动时,弹出窗口不会移动。因为Popups/Context菜单不是Visual Tree的一部分。你必须为此使用Adorner。我会建议阅读this四部分系列,以便在Adorner上快速入门。

+0

您是否知道在事实之后是否可以将元素应用于元素?我试图让这个程序非常模块化,所以弹出弹出窗口的列表视图是自定义用户控件的一部分,该控件嵌入页面中,该页面位于窗口中的导航框架内。我想这样做是为了让我所要做的就是将Adorner代码放在用户控件中,并告诉它附加到窗口。我可以将它附加到用户控件上,但我希望将它集中在窗口中。 – AndyD273