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

在使用C#(WinForms)的几年中,我从来没有使用过WPF。 但是,现在我喜欢WPF,但是我不知道当用户从File菜单中单击Exit菜单项时我该如何退出我的应用程序。

我努力了:

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

等等。 没有任何工作

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

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

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

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

  • 当ShutdownMode设置为OnLastWindowClose。
  • 当ShutdownMode设置为OnMainWindowClose。
  • 当用户结束会话并且SessionEnding事件未处理时,或者未经取消处理。

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

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

使用方法如下:

 Environment.Exit(0) 

正如wuminqi所说, Application.Current.Shutdown(); 是不可逆的,我相信它通常用于强制应用程序closures时,如用户注销或closuresWindows时。 相反,在主窗口中调用this.close() 。 这与在窗口上按下“ALT-F4”或closures[x]button相同。 这将导致所有其他拥有的窗口closures,并最终将调用Application.Current.Shutdown(); 只要接近的行动没有取消。 请参阅closures窗口的MSDN文档。

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

这应该做的伎俩:

 Application.Current.Shutdown(); 

如果你有兴趣,这里有一些额外的材料,我发现有帮助:

Application.Current的详细信息

WPF应用程序生命周期

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

1。

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

2。

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

以上所有的方法都会调用Window类的closing event ,执行可能会在某个时间点停止(因为在完全closures窗口之前,通常应用程序会将对话框设置为“您确定吗?”或“ 您希望在closures之前保存数据吗?

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

  Environment.Exit(0); 

不应该有一个Application.ShutDown(); 或.Exit()消息。

应用程序是一个静态类。 它不涉及当前的应用程序您需要到当前的应用程序,然后closures它像这样:

 Application.Current.Shutdown(); 

以下是我的做法:

 // 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(...)处理右上angular的xbutton。 如果有任何方法调用窗口更近,则Window_Closing(...)抓取用户确认后closures的事件。

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

那是我个人的经验。 最后,使用最适合您的scheme。 这只是另一个信息。

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

尝试

 App.Current.Shutdown(); 

为了我

 Application.Current.Shutdown(); 

没有工作。

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

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

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

我们可以使用MainWindow.xaml.cs文件中的this.Close()方法来closures窗口。

或者使用MainWindow.xaml.cs文件中的App.Current.Shutdown()方法closures窗口。

很简单,使用下面的代码

 Application.Current.Shutdown();