代码之家  ›  专栏  ›  技术社区  ›  sean Sergey Berezovskiy

当父窗口关闭时,如何关闭子窗口(WPF)

  •  1
  • sean Sergey Berezovskiy  · 技术社区  · 6 年前

    Show()

    _mainWindow.Closed += (_, __) => _childWindow.Close();
    

    对我来说,这似乎是一个非常典型的用例,所以我很惊讶不容易找到答案。也许我从错误的角度来看待这个问题?

    3 回复  |  直到 6 年前
        1
  •  5
  •   Loocid    6 年前

    你可以使用Windows.Owner属性。

    _childWindow.Owner = _mainWindow;
    

    https://docs.microsoft.com/en-us/dotnet/api/system.windows.window.owner?view=netframework-4.7.2

    如果你不想这些额外的行为,你可以基本上做你已经做了,但把它在childWindows构造函数像你想要的。

    public childWindow(Window parentWindow)
    {
        parentWindow.Closed += (s, e) => this.Close();
    }
    
        2
  •  1
  •   Bas    6 年前

    与其从子窗口处理这个问题,并且必须为您可能创建的每个新子窗口重复该代码,不如跟踪主窗口何时从应用程序类(在App.xaml.cs中)关闭,然后关闭所有子窗口?这样,子窗口就不必保留对父窗口的任何引用,您可以从中心应用程序类完成所有操作。

    像这样的

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        MainWindow mainWindow = new MainWindow();
        mainWindow.Closing += MainWindow_Closing;
    }
    
    private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        // close all child windows.
    }
    
        3
  •  1
  •   mm8    6 年前

    您可以将事件处理程序连接到应用程序主窗口的 Closed

    public partial class ChildWindow : Window
    {
        public ChildWindow()
        {
            InitializeComponent();
            Window mainWindow = Application.Current.MainWindow;
            if (mainWindow != null)
                mainWindow.Closed += (s, e) => Close();
        }
    }
    

    或者你可以设置 ShutdownMode 你的申请 OnMainWindowClose 在你的 App.xaml.cs @ChristianMurschall建议的课程:

    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            ShutdownMode = ShutdownMode.OnMainWindowClose;
        }
    }