C# 表单是如何关闭/处理的?

C# 表单是如何关闭/处理的?,c#,.net,wpf,C#,.net,Wpf,当我想在代码中使用多个窗口时,我通常会这样做: Window w = new MainWindow(); w.Show(); this.Close(); 但今天,我发现我可以做到: Window w = new MainWindow(); this.Close(); w.Show(); 我有点惊讶,所以我想知道this.Close到底是做什么的?然而,从上一页来看,它说如果最后一个窗口刚刚关闭,应用程序将停止运行(关闭),那么为什么呢 但是,这

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

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
s构造函数将新创建的窗口添加到
Application.Windows
集合中。方法执行以下代码:

if (((App.Windows.Count == 0)
    && (App.ShutdownMode == ShutdownMode.OnLastWindowClose))
    || ((App.MainWindow == this)
    && (App.ShutdownMode == ShutdownMode.OnMainWindowClose)))
{ 
    App.CriticalShutdown(0);
} 

基本上,您只是在改变以下顺序: 1.显示新窗口 2.关闭当前窗口 因为实际的渲染在退出代码后仍然会发生,所以应该没有区别。不管#1和#2的顺序如何,您永远不会离开窗口(尽管隐藏,但第二个窗口仍然存在),因此应用程序不会关闭

考虑下面的代码。虽然该显示在第一个窗口关闭后3秒进行,但应用程序将不存在。一旦用户单击“旋转”按钮,第一个窗口将消失3秒钟,并出现一个新窗口

XAML:


WPF有窗口、页面和用户控件,但没有表单。我不明白你们想说什么?谢谢,你们也可以,但上次创建的窗口是粗体的。这是有道理的,我想知道为什么在WPF中做了这样的更改?我仍然想知道,如果我删除了w.Show(),程序结束了,为什么在仍然有创建的窗口时它不应该关闭?@ChibuezeOpata你确定程序真的结束了吗?如果删除
w.Show()
,程序只会停留在进程中,没有任何打开的表单。我刚刚测试过,结果是这样。是的,但是为什么如果没有
w.Show()
它退出,而窗口仍然在那里?@ChibuezeOpata-它在那里,只是隐藏着。UI元素不一定要可见才能存在。“如果一棵树倒在森林里,周围没有人听到它,它会发出声音吗?”也许不会,但如果一扇窗户存在,没有人能看到它——它肯定存在。你不自相矛盾吗?
<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( );
}