Surface Pro平板模式下关闭子窗口致主窗口意外关闭求助
解决Surface Pro平板模式下WPF子窗口关闭导致整个应用退出的问题
我仔细排查了你的最小复现代码和问题场景,这个在Surface Pro平板上出现的异常,核心原因是子窗口未与主窗口建立Owner关联,加上平板触摸交互下的窗口管理逻辑和桌面端存在差异,导致关闭子窗口时系统误判为所有窗口都已关闭,进而触发应用退出。
具体解决方案
1. 为子窗口设置Owner属性
在打开testWindow时,明确将其Owner设置为主窗口,这样系统就能正确识别窗口的父子关系,关闭子窗口时不会影响主窗口。修改GUI.xaml.cs中的SettingsButton_Click方法:
private void SettingsButton_Click(object sender, RoutedEventArgs e) { monitoring.settingsWindow = new testWindow(); // 关键:将子窗口的Owner绑定到主窗口 monitoring.settingsWindow.Owner = Application.Current.MainWindow; monitoring.settingsWindow.Show(); }
2. 显式设置应用的ShutdownMode
默认WPF应用的ShutdownMode是OnLastWindowClose(最后一个窗口关闭时退出应用),在平板全屏无标题栏窗口场景下,容易出现系统误判。我们可以将其改为OnMainWindowClose,确保只有主窗口关闭时才退出应用。修改App.xaml.cs的ApplicationStartup方法:
private void ApplicationStartup(object sender, StartupEventArgs e) { // 设置关闭模式:仅主窗口关闭时才退出应用 ShutdownMode = ShutdownMode.OnMainWindowClose; window.Show(); monitoring = new Monitoring(); window.Content = monitoring.gui; this.DispatcherUnhandledException += App_DispatcherUnhandledException; this.Dispatcher.UnhandledException += Dispatcher_UnhandledException; }
为什么开发机正常而Surface Pro出现问题?
桌面端的窗口管理逻辑对无Owner的子窗口兼容性更好,关闭子窗口时系统会正确识别主窗口仍在运行;但Surface Pro的触摸交互优化和全屏窗口栈管理逻辑更严格,未设置Owner的子窗口会被视为独立顶级窗口,关闭时可能触发“所有窗口关闭”的判断,导致应用退出。
验证修改
将上述两处修改应用到你的最小复现代码中,在Surface Pro平板上测试:点击主窗口的“NewWindow”按钮打开子窗口,再点击子窗口的关闭按钮,此时应该只有子窗口关闭,主窗口保持运行状态。
内容的提问来源于stack exchange,提问作者Ecuashungo
相关产品推荐
相关产品推荐

