关闭一个窗口后关闭WPF中的所有窗口
本文关键字:窗口 WPF 一个 | 更新日期: 2023-09-27 17:53:04
是否有任何方法可以在用户关闭其中一个窗口后关闭所有窗口,这里是重要的部分:不使用App.Current.Shutdown()
,而是通过单独调用剩余窗口上的close
?
我的想法是在Window_Closing
事件处理程序方法中的每个剩余窗口上调用close
。但有一个问题。假设我有两个窗口类,A
和B
。我分别创建了一个A
和B
实例——a
和b
。如果我关闭窗口A
,那么它调用Window_closing
事件处理程序方法并在那里调用b.close()
。然后在B
类(A
和B
是窗口类,它们都继承自Window
) Window_closing
方法被调用(因为我刚刚调用了B.close()
), B::Window_closing
调用a.close()
,它导致异常,因为我已经关闭了a
。
解决这个问题的正确方法是什么?
如果你有兴趣拥有一个"主窗口"answers"工具窗口",所以关闭主窗口关闭所有他们和关闭工具窗口,好吧,只是这样-然后在App.xaml
有一个友好的选项,只是为了!
应用程序。ShutdownMode
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
ShutdownMode="OnMainWindowClose"
>
</Application>
请注意,这里的"主窗口"是,即应用程序开始时的主窗口(或者你设置为主窗口的那个,如果你在应用程序的生命周期中使用它)。
这当然会关闭所有的窗口,但我不确定它是否调用正常的"关闭",或者只是关闭整个应用程序。对不起,你需要自己检查一下。如果你对我的观点感兴趣,这是你应该/可以轻松做到的方式,如果你真的需要通过"Close()"关闭应用程序。,然后我感觉到你在这里做错了什么,如果我没记错的话,"window . close()"可能被取消。EDIT2: yup, Window.Close()
可以取消。请看这篇文章:
关闭窗口会引发
Closing
事件。如果Closing
事件未被取消,发生以下情况:(…)
因此,循环窗口集合并调用'Close'并不能真正保证窗口将被关闭,并且应用程序可能之后仍在运行。
像这样:
private static bool WindowsClosing;
public static void CloseAllWindows()
{
if(WindowsClosing) return;
WindowsClosing = true;
var windows = Application.Current.Windows;
foreach (var wnd in windows.OfType<Window>())
{
wnd.Close();
}
}
并从您的Window_Closing
(或者更确切地说是Window_Closed
,如果你不需要取消)事件调用该方法
处理Window.Closed
事件而不是Window.Closing
,这将关闭除MainWindow
以外所有打开的窗口。我没有为MainWindow
调用Close
方法,因为这是主线程,将导致应用程序终止。
private void Window_Closed(object sender, EventArgs e)
{
var windows = Application.Current.Windows;
foreach (var item in windows)
{
if ((item as Window).Title.ToLower() == "mainwindow") continue;
(item as Window).Close();
}
}