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


477

几年来,我一直在使用C#(Windows窗体),但从未使用过WPF。但是,现在我喜欢WPF,但是当用户单击“文件”菜单中的“退出”菜单项时,我不知道如何退出应用程序。

我努力了:

this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();

除其他外。没用。

Answers:


780

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

System.Windows.Application.Current.Shutdown();

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

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

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

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


8
正如我指出的那样,这并不奇怪。在WPF中,Application是一个静态类。Application.Current是对当前正在运行的Application的引用。
TimothyP 2010年

4
我认为,乍一看这并不明显,而且与过去的模型有足够的偏差,足以将人们拒之门外,这有点奇怪。它当然可以正常工作是很有意义的。
Brian MacKay 2010年

20
如果您致电,Application.Current.Shutdown();您的联系将不会立即返回。您也需要为此打电话return;
Erwin Mayer 2012年

2
我使用了此方法,从一个窗口弹出另一个窗口,并在该窗口的window_closed事件中添加了此代码。所有窗口都消失了,但是该程序仍然运行超出创建弹出窗口后的位置。
diyoda_

7
@TimothyP否Application不是静态类。拥有Application.Current静态成员并不意味着它是静态的。相反,它是可以派生的普通类。
Earth Engine

156

如果确实需要关闭它,则也可以使用Environment.Exit(),但它一点都不优雅(更像是结束进程)。

如下使用它:

Environment.Exit(0)

4
Environment.Exit()需要至少一个参数,即退出代码。使用Environment.Exit(0),如果你不关心的退出代码。
gbmhunter 2013年

23
此方法实际上关闭了所有内容。我的应用程式与Application.Current.Shutdown();
gbmhunter

4
Environment.Exit绝对是确保应用程序关闭的正确方法。使用Application.Current.Shutdown,可以轻松地使应用程序无限期地运行,前提是您拥有将自身推回到调度程序中的代码。
MarcusAndrén'13

等于Application.exit(0);
赛卡2015年

随着Application.Current.Shutdown();我的Closing事件是所谓的,我只是想关闭我立即应用。所以Environment.Exit(0);是更好的选择。
FredM

64

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

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

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


2
+1我决定使用这个,尤其是因为我需要在实际退出应用程序之前保存打开的文件。
AgentKnopf

2
这里要注意的重要一件事是,艾伦指出了一个非常重要的事实:所有其他拥有的窗户都将关闭。您必须确保声明所有权。如果您有一个正在运行的窗口,然后您打开了另一个窗口,但尚未显示,则在关闭活动窗口后,隐藏的窗口将强制应用程序继续运行。除非您通过其他方式(任务管理器等)关闭该窗口,否则可能会导致内存泄漏。我已经测试过了
BK 2014年

35

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

1。

 App.Current.Shutdown();
OR
 Application.Current.Shutdown();

2。

 App.Current.MainWindow.Close();
OR
 Application.Current.MainWindow.Close();

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

3.但是,如果您想立即终止应用程序而没有任何警告。在下面使用

   Environment.Exit(0);


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();
    }
}

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

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

那是根据我的个人经验。最后,使用最适合您的方案的方法。这只是另一条信息。


16

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

Application是静态类。它不引用当前的应用程序。您需要转到当前应用程序,然后按如下所示将其关闭:

Application.Current.Shutdown();

8

另一种方法是:

System.Diagnostics.Process.GetCurrentProcess().Kill();

这将强制终止您的应用程序。即使在多线程应用程序中,它也始终有效。

注意:请注意不要在另一个线程中丢失未保存的数据。


这似乎是难以理解的:“在过程中总是可行的”。你能修好它吗?或者至少在评论中解释您的意思?
彼得·莫滕森

这在某种程度上也是无法理解的:只关心一个将数据保存在另一个线程的文件中的应用程序。你能修好它吗?或者至少在评论中解释您的意思?
彼得·莫滕森

你在使用谷歌翻译吗?
彼得·莫滕森

不,我不是,我的意思是当应用程序作为多线程运行并且您使用Process.Kill时,它将起作用,但是这样的另一种方式。当另一个线程正在运行时,关闭在多线程应用程序中不起作用。
阿里·尤塞菲

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);
}

这不是他只想知道如何退出WPF应用程序的问题答案。
mehdi


6

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

如果要显示一个确认窗口让用户确认是否退出,Application.Current.Shutdown()则是不可逆的。


7
我不明白 但是,我们可以在致电之前得到用户确认Application.Current.Shutdown()
Amsakanna

2
我不明白您为什么要确认。太多的确认是非常不好的事情。确实有人在努力单击以打开“文件”菜单,一直向下移动到“文件”菜单的底部,然后单击“退出”,这一事实已被证实他们不再希望使用该应用程序。

Veer:就我而言,确实会出现确认窗口,但是即使您在确认中选择“取消”,主应用程序也会退出。
wuminqi 2010年

7
JTS:最好逐案设计。我们的应用程序,如果有作业在运行,强制出口将造成损坏,因此我们最好在确认对话框中告知他们
wuminqi 2010年

3

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

1)终止进程,从而跳过最终确定,错误处理等:

Process.GetCurrentProcess().Kill();

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

Application.Current.Shutdown();

要么

this.Shutdown();

(在应用类的实例中抓紧时)

3)关闭目前的应用程式(必须先关闭/完成所有表格):

this.Close(); 

(在应用类的实例中抓紧时)

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

Environment.Exit(0);

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


2

Caliburn微风味

public class CloseAppResult : CancelResult
{
    public override void Execute(CoroutineExecutionContext context)
    {
        Application.Current.Shutdown();
        base.Execute(context);
    }
}

public class CancelResult : Result
{
    public override void Execute(CoroutineExecutionContext context)
    {
        OnCompleted(this, new ResultCompletionEventArgs { WasCancelled = true });
    }
}

什么“卡利微味”是什么意思?
彼得·莫滕森

您如何使用Caliburn Micro
Anders

0

如果要从另一个未创建应用程序对象的线程退出,请使用:

System.Windows.Application.Current.Dispatcher.InvokeShutdown();

-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;


2
欢迎来到Alpha-LIon!此处不建议使用仅代码的答案,因为它们无法提供有关如何解决问题的见解。请更新您的解决方案,并说明您的代码如何解决OP的问题:)
Joel

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.