首页 > 解决方案 > 如果所有者窗口以编程方式关闭,WPF ShowDialog() 不会返回

问题描述

假设我有两个窗口,一个 MainWindow 和一个 TestWindow。然后我这样做:

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
        var window1 = new TestWindow();
        window1.Show();

        var timer = new Timer();
        timer.Interval = TimeSpan.FromSeconds(3).TotalMilliseconds;
        timer.Elapsed += (s, e1) => Application.Current.Dispatcher.BeginInvoke((Action) (() => window1.Close()));
        timer.Start();

        var window2 = new TestWindow();
        window2.Owner = window1;
        window2.ShowDialog();
    }

3 秒后,两个 TestWindows 都关闭,但应用程序挂起。知道为什么吗?

标签: .netwpf

解决方案


已报告此问题:https ://github.com/dotnet/wpf/issues/277

显然,当您按预期调用时,堆栈顶部的窗口 ( window2) 不会关闭。Close()window1

这种行为意味着您需要确保以与打开窗口相反的顺序关闭窗口,即Close()window2关闭之前调用window1

var window1 = new TestWindow();
window1.Show();

var window2 = new TestWindow();

var timer = new Timer();
timer.Interval = TimeSpan.FromSeconds(3).TotalMilliseconds;
timer.Elapsed += (s, e1) => Application.Current.Dispatcher.BeginInvoke((Action)(() => { window2.Close(); window1.Close(); }));
timer.Start();

window2.Owner = window1;
window2.ShowDialog();

推荐阅读