子窗口关闭后,如何关闭子窗口? (WPF)

时间:2018-10-09 00:27:07

标签: c# wpf windows xaml

我有一个通过Show()创建和显示的子窗口。用户可以关闭主应用程序窗口,但仍显示我的子窗口。我该如何处理这种情况?我的首选是从子窗口的构造函数处理所有这些,因为可以从多个位置实例化此窗口。换句话说,我不想在主窗口的“ Closing”事件处理程序中添加专门用于关闭此子窗口的代码,例如:

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

对我来说,这似乎是一个非常典型的用例,因此我很惊讶没有轻易找到答案。也许我是从错误的角度来解决这个问题?

3 个答案:

答案 0 :(得分:2)

您可以使用Windows.Owner属性。

_childWindow.Owner = _mainWindow;

这会自动添加关闭mainWindow时将关闭childWindow的行为。但是,它还带有您可能想要或不想要的其他行为。在此处阅读更多信息:

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();
}

答案 1 :(得分:1)

您可以在子窗口的构造函数中将事件处理程序连接到应用程序主窗口的Closed事件:

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

或者您可以按照@ChristianMurschall的建议,在ShutdownMode类中将应用程序的OnMainWindowClose设置为App.xaml.cs

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

答案 2 :(得分:0)

与其在子窗口中进行处理,而不必为可能创建的每个新子窗口重复该代码,为什么不跟踪主窗口何时从Application类(在App.xaml.cs中)关闭,然后还关闭所有子窗口吗?这样,子窗口不必保留对父窗口的任何引用,您可以从中央App类进行所有操作。

类似

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.
}