如何以编程方式退出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的x
button。 如果有任何方法调用窗口更近,则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();