1.在某处声明打开的弹出窗口的静态数组: static List<Popup> openedPopups = new List<Popup>(); 1.在打开弹出窗口之前,请关闭之前打开的所有弹出窗口: private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // close all before opene popup openedPopups.ForEach(p => p.IsOpen = false); openedPopups.Clear(); // clear opened popus's collection, because they were closed Popup1.IsOpen = true; // open popup I need open now openedPopups.Add(Popup1); // remember it for future close }
5条答案
按热度按时间puruo6ea1#
WPF弹出窗口实际上创建了一个新窗口(Win32窗口,而不是WPF
Window
示例)。因此,您无法在Application.Windows
集合中找到它,但您可能可以使用Win32 API(如EnumChildWindows
)找到它。我认为
HwndSource
的RootVisual
是Popup
(没有检查,您可能需要在可视树中更深入地查看)。因此代码应该类似于下面的代码(完全未经测试):
az31mfrm2#
通过可视化树是一种不依赖于你最初是如何创建它们的方法。可能有很多更干净的方法来完成它,但它们都真正依赖于你的实现。
例如,我的应用程序中的所有Popup都绑定到视图模型对象,这些对象公开Popup绑定到的某种
IsOpen
属性。(或者一个生成器方法),我可以迭代这些方法,并在每个方法上将IsOpen
设置为false。3xiyfsfu3#
可接受的答案(https://stackoverflow.com/a/3886139/12885902)对我来说并不管用,因为
source.RootVisual
从来不是Popup
类型,而是内部类型PopupRoot
。另请记住,CloseAllPopups()方法必须由主UI线程调用(例如
Application.Current.Dispatcher.Invoke()
)!xsuvu9jc4#
我之前的答案也不是一直有效。它只在Visual Studio调试器附加到进程时有效。在任何情况下都有效的是以下内容:
kh212irz5#
1.在某处声明打开的弹出窗口的静态数组:
static List<Popup> openedPopups = new List<Popup>();
1.在打开弹出窗口之前,请关闭之前打开的所有弹出窗口:
private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // close all before opene popup openedPopups.ForEach(p => p.IsOpen = false); openedPopups.Clear(); // clear opened popus's collection, because they were closed Popup1.IsOpen = true; // open popup I need open now openedPopups.Add(Popup1); // remember it for future close }