当我想在我的代码中使用多个窗口时,我通常会这样做:
Window w = new MainWindow();
w.Show();
this.Close();
但今天,我发现我可以这样做:
Window w = new MainWindow();
this.Close();
w.Show();
我有点惊讶,所以我想知道this.Close
究竟做了什么?然而,从documentation开始,它表示如果最后一个窗口刚刚关闭,应用程序将停止运行(关闭),那么为什么会这样呢?
但是,这样做不在WinForms中工作,只有WPF。
答案 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( );
}