.net - 如果所有者窗口以编程方式关闭,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 都关闭,但应用程序挂起。知道为什么吗?
解决方案
已报告此问题: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();
推荐阅读
- cfgrib - 如何按压力级别提取信息?
- javascript - Jquery 方法不适用于动态生成的元素
- javascript - 在 Angular 中制作 editForm 的最简单方法是什么?
- r - 如何有效地找到序列坐标inn R的两个数据表之间的重叠?
- react-native - 测试套件无法运行从“mylocalfile.js”中找不到模块“@env”
- android - 防止 Google Admob 服务限制
- powershell - Powrshell 导出所有 PC 的列表以及它们是否安装了特定的应用程序
- android - 具有动态项目高度的水平 RecyclerView
- python - 使用 Python 的 POST 请求
- java - 如何在 Keycloak 上创建自定义 UserStorageSPI