Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当父窗口关闭时,如何关闭子窗口?(WPF)_C#_Wpf_Windows_Xaml - Fatal编程技术网

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

C# 当父窗口关闭时,如何关闭子窗口?(WPF),c#,wpf,windows,xaml,C#,Wpf,Windows,Xaml,我有一个通过Show()创建和显示的子窗口。用户可以关闭主应用程序窗口,但仍会显示“我的孩子”窗口。我如何处理这种情况?我的首选是从子窗口的构造函数处理这一切,因为这个窗口可以从多个位置实例化。换句话说,我不想在主窗口的“关闭”事件处理程序中添加专门用于关闭此子窗口的代码,例如: _mainWindow.Closed += (_, __) => _childWindow.Close(); 对我来说,这似乎是一个非常典型的用例,所以我很惊讶不能轻易找到答案。也许我从错误的角度处理这个问题?

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

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

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

您可以使用Windows.Owner属性

_childWindow.Owner = _mainWindow;
这会自动添加以下行为:当您关闭主窗口时,子窗口将关闭。然而,它也伴随着你可能想要或不想要的其他行为。请在此处阅读更多信息:

如果您不想要这些额外的行为,您基本上可以做您已经做过的事情,但可以像您所希望的那样将其放入childWindows构造函数中

public childWindow(Window parentWindow)
{
    parentWindow.Closed += (s, e) => this.Close();
}

与其从子窗口处理此问题,并为可能创建的每个新子窗口重复该代码,为什么不跟踪主窗口何时从应用程序类(在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.
}

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

public partial class ChildWindow : Window
{
    public ChildWindow()
    {
        InitializeComponent();
        Window mainWindow = Application.Current.MainWindow;
        if (mainWindow != null)
            mainWindow.Closed += (s, e) => Close();
    }
}
或者您可以按照@ChristianMurschall的建议,在
App.xaml.cs
类中将应用程序的
ShutdownMode
设置为
OnMainWindowClose

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

嗯,我喜欢所有者的想法,但似乎我的问题是无法轻松访问父窗口。如何从控件中标识和使用父窗口?这可能是一个非常简单的问题…@sean如果不了解更多关于代码设置的信息,很难说。如果您是从UserControl或其他内容中调用,请尝试在子窗口的构造函数中使用
Owner=Application.Current.MainWindow
。我更喜欢用这种自主权来处理此类维护问题。您可以将应用程序的设置为
OnMainWindowClose
。默认行为是
OnLastWindowClose