Всплывающее окно WPF фактически создает новое окно (окно Win32, а не экземпляр WPF Window
).Таким образом, вы не можете найти его в коллекции Application.Windows
, но вы, вероятно, можете найти его с помощью Win32 API, например EnumChildWindows
.
Когда у вас есть дескриптор, вы можете получить егосвязанный HwndSource
.Я думаю, что RootVisual
из HwndSource
- это Popup
(не проверял, возможно, вам придется заглянуть глубже в визуальное дерево).
Так что код должен быть похож на это (полностьюне проверено):
public static class PopupCloser
{
public static void CloseAllPopups()
{
foreach(Window window in Application.Current.Windows)
{
CloseAllPopups(window);
}
}
public static void CloseAllPopups(Window window)
{
IntPtr handle = new WindowInteropHelper(window).Handle;
EnumChildWindows(handle, ClosePopup, IntPtr.Zero);
}
private static bool ClosePopup(IntPtr hwnd, IntPtr lParam)
{
HwndSource source = HwndSource.FromHwnd(hwnd);
if (source != null)
{
Popup popup = source.RootVisual as Popup;
if (popup != null)
{
popup.IsOpen = false;
}
}
return true; // to continue enumeration
}
private delegate bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
}