关闭一个窗口后,关闭WPF中的所有窗口

时间:2015-06-03 09:35:15

标签: c# wpf

有什么办法可以在用户关闭其中一个窗口后关闭所有窗口,这是重要的部分:不使用App.Current.Shutdown(),而是单独在剩余的窗口上调用close?< / p>

我的想法是在close事件处理程序方法中的每个剩余窗口上调用Window_Closing。但是有一个问题。假设我有两个窗口类AB。我分别创建了AB - ab的一个实例。如果我关闭窗口A,那么它会调用Window_closing事件处理程序方法并在那里调用b.close()。然后在B类(AB是窗口类,它们都从Window} Window_closing方法继承而被调用(因为我刚刚调用B.close()}和B::Window_closing来电a.close(),这导致异常,因为我已经关闭了a

解决这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

如果您有兴趣拥有一个&#34;主窗口&#34;和&#34;工具窗口&#34;,以便关闭主窗口关闭所有这些窗口并关闭工具窗口,只有那样 - 然后在App.xaml那里有一个友好的选项只是为了该!

那是Application.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>

请注意,这里是&#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)调用该方法