有什么办法可以在用户关闭其中一个窗口后关闭所有窗口,这是重要的部分:不使用App.Current.Shutdown()
,而是单独在剩余的窗口上调用close
?< / p>
我的想法是在close
事件处理程序方法中的每个剩余窗口上调用Window_Closing
。但是有一个问题。假设我有两个窗口类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
。
解决这个问题的正确方法是什么?
答案 0 :(得分:3)
如果您有兴趣拥有一个&#34;主窗口&#34;和&#34;工具窗口&#34;,以便关闭主窗口关闭所有这些窗口并关闭工具窗口,只有那样 - 然后在App.xaml
那里有一个友好的选项只是为了该!
<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>
请注意,这里是&#34; MainWindow&#34;问题是,主窗口应用程序的开头(或者您设置为main的那个,如果您在应用程序的生命周期中使用它)。
编辑:事后补充:当然会关闭所有窗口,但我不确定它是否称为正常&#34;关闭&#34;,或者只是关闭整个应用程序。对不起,您需要亲自检查一下。如果您对我的观点感兴趣,那就是您应该/可以轻松地做到这一点的方式,如果您真的需要通过&#34;关闭()&#34;来关闭应用程序。在每个窗口,然后我感觉到你在这里做错了,好像我没记错,&#34; Window.Close()&#34;可能会被取消。
EDIT2:是的,Window.Close()
可以取消。请see this article:
关闭窗口会导致
Closing
事件被引发。如果Closing
事件未被取消,发生以下情况:(...)
循环遍历窗口集合并调用&#39;关闭&#39;并不能真正保证窗户真的会关闭,之后应用程序可能仍会继续运行。
答案 1 :(得分:0)
处理Window.Closed
事件而非Window.Closing
,这将关闭MainWindow
以外的所有已打开窗口。我没有为Close
调用MainWindow
方法,因为这是导致应用程序终止的主线程。
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();
}
}
答案 2 :(得分:0)
这样的事情:
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
)调用该方法