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

时间:2012-03-22 19:02:00

标签: c# .net wpf

当我想在我的代码中使用多个窗口时,我通常会这样做:

Window w = new MainWindow();
w.Show();            
this.Close();

但今天,我发现我可以这样做:

Window w = new MainWindow();
this.Close();
w.Show();            

我有点惊讶,所以我想知道this.Close究竟做了什么?然而,从documentation开始,它表示如果最后一个窗口刚刚关闭,应用程序将停止运行(关闭),那么为什么会这样呢?

但是,这样做在WinForms中工作,只有WPF。

2 个答案:

答案 0 :(得分:1)

关闭窗口会导致其拥有的所有窗口都关闭。此外,关闭窗口可能会导致应用程序停止运行,具体取决于Application.ShutdownMode属性的设置方式。

它的默认值为OnLastWindowClose,这意味着只有在关闭最后创建的窗口后应用程序才会关闭。在您的示例中的this.Close()点,您已经有2个窗口(无论窗口是打开还是隐藏)。

您可以在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 :(得分: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( );
}