表单究竟是如何关闭/处置的

本文关键字:何关闭 究竟 表单 | 更新日期: 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( );
}