Ein WPF-Popup erstellt tatsächlich ein neues Fenster (ein Win32-Fenster, nicht ein WPF Window
Instanz). Sie können es also nicht in der Application.Windows
Sammlung, aber Sie können sie wahrscheinlich mit einer Win32-API wie EnumChildWindows
.
Sobald Sie das Handle haben, können Sie die zugehörige HwndSource
. Ich denke, die RootVisual
de la HwndSource
ist die Popup
(Ich habe es nicht überprüft, vielleicht müssen Sie tiefer in den visuellen Baum schauen).
Der Code sollte also in etwa so lauten (völlig ungetestet):
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);
}