如何以编程方式退出WPF应用程序?

453 .net c# wpf shutdown

在我使用C#(Windows Forms)的几年里,我从未使用过WPF.但是,现在我喜欢WPF,但是当用户点击"文件"菜单中的"退出"菜单项时,我不知道如何退出应用程序.

我试过了:

this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();
Run Code Online (Sandbox Code Playgroud)

其中许多人.什么都行不通.

Dir*_*mar 741

要退出您的应用程序,您可以致电

System.Windows.Application.Current.Shutdown();
Run Code Online (Sandbox Code Playgroud)

如该Application.Shutdown方法的文档中所述,您还可以通过指定ShutdownMode来修改应用程序的关闭行为:

在以下情况下,Windows Presentation Foundation(WPF)会隐式调用Shutdown:

  • 当ShutdownMode设置为OnLastWindowClose时.
  • 当ShutdownMode设置为OnMainWindowClose时.
  • 当用户结束会话并且SessionEnding事件未处理或处理而没有取消时.

还请注意,Application.Current.Shutdown();只能从创建Application对象的线程调用,即通常是主线程.

  • 如果你调用`Application.Current.Shutdown();`你的函数不会立即返回.你需要为此调用`return;`. (19认同)
  • 正如我所指出的那样并不奇怪.在WPF中,Application是一个静态类.Application.Current是对当前运行的Application的引用. (8认同)
  • @TimothyP否`Application`不是静态类.拥有`Application.Current`静态成员并不意味着它是静态的.相反,它是一个可以派生的普通类. (7认同)
  • 在我看来,从某种意义上来说这有点奇怪,乍一看并不明显,它与过去的模型相差甚远,让人们失望.它当然是有效的,这是完全合理的. (4认同)
  • 我用过这个,从一个窗口弹出另一个窗口,在那个窗口的window_closed事件中,我添加了这个代码.所有的窗口都会消失,但程序仍然会在创建弹出窗口之后运行. (2认同)

Joh*_*ohn 147

如果你真的需要它关闭,你也可以使用Environment.Exit(),但它根本不优雅(更像是结束进程).

使用方法如下:

Environment.Exit(0)
Run Code Online (Sandbox Code Playgroud)

  • 这种方法实际上关闭了一切 我的应用程序正在使用`Application.Current.Shutdown();正在运行一些东西(表单正在关闭,但进程仍在运行) (22认同)
  • `Environment.Exit()`至少需要一个参数,一个退出代码.如果您不关心退出代码,请使用`Environment.Exit(0)`. (4认同)
  • Environment.Exit绝对是确保关闭应用程序的正确方法.使用Application.Current.Shutdown,如果你有将代码推回调度程序的代码,你可以很容易地无限期地运行应用程序. (4认同)
  • 使用`Application.Current.Shutdown();` 我的`Closing` 事件被调用,当我只想立即关闭我的应用程序时。所以`Environment.Exit(0);` 是更好的选择。 (2认同)

All*_*uky 61

正如wuminqi所说,Application.Current.Shutdown();是不可逆转的,我相信它通常用于强制应用程序关闭,例如当用户注销或关闭Windows时.

而是this.close()在主窗口中调用.这与按窗口上的Alt+ F4或关闭[x]按钮相同.这将导致所有其他拥有的窗口关闭,并且Application.Current.Shutdown();只要关闭操作未被取消,它将结束调用.请参阅关闭窗口的MSDN文档.

此外,因为this.close()是可取消的,您可以在结束事件处理程序中放入保存更改确认对话框.只需为事件处理程序创建<Window Closing="...">并相应地更改e.Cancel.(有关如何执行此操作的详细信息,请参阅MSDN文档.)

  • +1我决定使用这个,特别是因为我需要在实际退出应用程序之前保存打开的文件. (2认同)
  • 这里要注意的一件重要事情是艾伦指出了一个非常重要的事实:所有其他拥有的窗户都将被关闭.您必须确保声明所有权.如果您有一个正在运行的窗口然后打开另一个窗口但尚未显示它,则在关闭活动窗口后,隐藏窗口将强制应用程序继续运行.除非您通过其他方式关闭该窗口(任务管理器等),否则您将有潜在的内存泄漏.我测试了这个. (2认同)

Kyl*_*Ren 33

根据需要使用以下任何一项:

1.

 App.Current.Shutdown();
OR
 Application.Current.Shutdown();
Run Code Online (Sandbox Code Playgroud)

2.

 App.Current.MainWindow.Close();
OR
 Application.Current.MainWindow.Close();
Run Code Online (Sandbox Code Playgroud)

上述所有方法将调用closing eventWindow类和执行可能在某一时刻停止(原因通常应用把对话像"你确定吗?"或者" 你想在关闭之前保存数据? ",之前完全关闭的窗口)

3.但是如果你想立即终止申请而没有任何警告.使用下面

   Environment.Exit(0);
Run Code Online (Sandbox Code Playgroud)


Bri*_*Kay 25

这应该做的伎俩:

Application.Current.Shutdown();
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣,这里有一些我觉得有用的其他材料:

关于Application.Current的详细信息

WPF应用程序LifeCycle


B.K*_*.K. 18

这就是我的做法:

// Any control that causes the Window.Closing even to trigger.
private void MenuItemExit_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}

// Method to handle the Window.Closing event.
private void Window_Closing(object sender, CancelEventArgs e)
{
    var response = MessageBox.Show("Do you really want to exit?", "Exiting...",
                                   MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
    if (response == MessageBoxResult.No)
    {
        e.Cancel = true;
    }
    else
    {
        Application.Current.Shutdown();
    }
}
Run Code Online (Sandbox Code Playgroud)

我只Application.Current.ShutDown()从主应用程序窗口调用,所有其他窗口都使用this.Close().在我的主窗口中,Window_Closing(...)处理右上方的x按钮.如果任何方法要求窗口Window_Closing(...)关闭,则在用户确认时抓取事件以关闭窗口.

我实际上Application.Current.Shutdown()在我的主窗口中使用的原因是我注意到如果设计错误并且我没有在应用程序中声明我的一个窗口的父窗口,如果该窗口打开而没有显示之前到最后一个活动窗口关闭,我留下了一个在后台运行的隐藏窗口.该应用程序不会关闭.防止完全内存泄漏的唯一方法是让我进入任务管理器关闭应用程序. Application.Current.Shutdown()保护我免受意外的设计缺陷.

这是我个人的经验.最后,使用最适合您场景的方法.这只是另一条信息.


Tim*_*hyP 16

不应该有消息Application.ShutDown();.Exit()消息.

Application是一个静态类.它不涉及当前的应用程序.您需要转到当前应用程序,然后将其关闭,如下所示:

Application.Current.Shutdown();
Run Code Online (Sandbox Code Playgroud)


bur*_*und 9

总结一下,有几种方法可以做到这一点。

1)杀死进程,跳过终结,错误处理等:

Process.GetCurrentProcess().Kill();
Run Code Online (Sandbox Code Playgroud)

2)关闭当前应用程序,这可能是正确的方法,因为它会调用退出事件:

Application.Current.Shutdown();
Run Code Online (Sandbox Code Playgroud)

或者

this.Shutdown();
Run Code Online (Sandbox Code Playgroud)

(当在 App 类的实例中调用时)

3)关闭当前应用程序(所有表格必须提前关闭/完成):

this.Close(); 
Run Code Online (Sandbox Code Playgroud)

(当在 App 类的实例中调用时)

4)退出环境,终止应用程序:

Environment.Exit(0);
Run Code Online (Sandbox Code Playgroud)

此外,您可能想在此处阅读有关退出状态的信息

  • “环境.退出(0);” 为我工作。得票最多的答案是“System.Windows.Application.Current.Shutdown();” 当应用程序尝试运行下一个代码行时,它不起作用。给你投了赞成票。谢谢 (2认同)

wum*_*nqi 6

据我了解,Application.Current.Shutdown()也有其缺点.

如果您想显示确认窗口以让用户确认是否退出,Application.Current.Shutdown()则不可逆转.

  • 我不明白这一点.我们可以在调用`Application.Current.Shutdown()`之前获得用户确认. (7认同)
  • JTS:最好根据具体情况进行设计.我们的应用程序,如果有工作正在运行,强制退出将导致损坏,所以我们最好在确认对话框中通知他们 (7认同)
  • 我不明白你为什么要确认.太多的确认是非常糟糕的事情.事实上,有人花了点心打开文件菜单,一直向下移动到文件菜单的底部,然后单击退出,几乎确认他们不再希望使用该应用程序. (2认同)

小智 6

private void _MenuExit_Click(object sender, RoutedEventArgs e)
{
   System.Windows.Application.Current.MainWindow.Close();
}

//Override the onClose method in the Application Main window

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    MessageBoxResult result =   MessageBox.Show("Do you really want to close", "",
                                          MessageBoxButton.OKCancel);
    if (result == MessageBoxResult.Cancel)
    {
       e.Cancel = true;
    }
    base.OnClosing(e);
}
Run Code Online (Sandbox Code Playgroud)


Iwo*_*icz 6

尝试

App.Current.Shutdown();
Run Code Online (Sandbox Code Playgroud)

为了我

Application.Current.Shutdown(); 
Run Code Online (Sandbox Code Playgroud)

没用.


Ali*_*efi 6

另一种方法可以做到这一点:

System.Diagnostics.Process.GetCurrentProcess().Kill();
Run Code Online (Sandbox Code Playgroud)

这将强制终止您的应用程序正在多线程应用程序中工作.

注意:只关心一个将数据保存在另一个线程的文件中的应用程序.