表单究竟是如何关闭/处置的
本文关键字:何关闭 究竟 表单 | 更新日期: 2023-09-27 18:28:37
当我想在代码中使用多个窗口时,我通常会这样做:
Window w = new MainWindow();
w.Show();
this.Close();
但今天,我发现我可以做到这一点:
Window w = new MainWindow();
this.Close();
w.Show();
我有点惊讶,所以我想知道this.Close
到底是做什么的?然而,从文档中可以看出,如果最后一个窗口刚刚关闭,应用程序将停止运行(关闭),那为什么呢?
但是,在WinForms中不起作用,只能在WPF中起作用。
关闭一个窗口会导致它拥有的任何窗口都被关闭。此外,根据Application.ShutdownMode
属性的设置方式,关闭窗口可能会导致应用程序停止运行。
它的默认值是OnLastWindowClose
,这意味着应用程序只有在关闭上次创建的窗口之后才会关闭。在示例中的this.Close()
处,您已经有两个窗口(无论窗口是打开还是隐藏)。
您可以在WPF源中看到它,Window
的构造函数将新创建的窗口添加到Application.Windows
集合中。Window.Close()
方法执行以下代码:
if (((App.Windows.Count == 0)
&& (App.ShutdownMode == ShutdownMode.OnLastWindowClose))
|| ((App.MainWindow == this)
&& (App.ShutdownMode == ShutdownMode.OnMainWindowClose)))
{
App.CriticalShutdown(0);
}
基本上,您只是在更改以下各项的顺序:1.显示新窗口2.关闭当前窗口由于实际渲染是在您退出代码后进行的,所以应该没有什么区别。不管#1和#2的顺序如何,您永远不会离开窗口(虽然隐藏,但第二个窗口存在),因此应用程序不会关闭。
请考虑下面的代码。尽管Show发生在第一个窗口关闭后3秒,但应用程序将不存在。一旦用户点击"旋转"按钮,第一个窗口将消失3秒钟,并出现一个新窗口。
XAML:
<Button Click="Button_Click" Content="Rotate" Width="80" Height="50"/>
代码背后:
private void Button_Click( object sender, RoutedEventArgs e ) {
MainWindow w = new MainWindow( );
this.Close( );
DispatcherTimer timer = new DispatcherTimer( );
timer.Interval = new TimeSpan( 0, 0, 3 );
timer.Tick += ( o, a ) => {
( (DispatcherTimer)o ).Stop( );
w.Show( );
};
timer.Start( );
}