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

本文关键字:窗口 WPF 一个 | 更新日期: 2023-09-27 17:53:04

是否有任何方法可以在用户关闭其中一个窗口后关闭所有窗口,这里是重要的部分:不使用App.Current.Shutdown(),而是通过单独调用剩余窗口上的close ?

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

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

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

如果你有兴趣拥有一个"主窗口"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();
    }
}