WPF关闭应用程序,释放Window窗口资源方法
- WindowsForm里一个Application.Exit();方法就可以关闭应用程序,释放掉资源。
- WPF里Application类没有该方法,但是有一个Exit的事件驱动,在WPF应用程序里面关闭程序讲究很多:
在WPF应用程序的关闭是有ShutdownMode属性设置,具有3中枚举类型的值:
1)OnLastWindowClose 应用程序最后一个窗体关闭时关闭应用程序
2)OnMainWindowClose 应用程序主窗体关闭时关闭应用程序
3)OnExplicitShutdown 显示调用关闭
- 1. 在OnExplicitShutdown模式下必须显示调用Application实例的ShutDown方法
例如:Application.Current.Shutdown(-1);
Application.Current.ShutdownMode=ShutdownMode.OnLastWindowClose;
这里Application.Current返回当前应用程序的当前Application实例。
注意以上不适应XBAP,XBAP在浏览器关闭时自动关闭。
例如在.cs里面
protected override void OnClosed(EventArgs e)
{
//Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
//if (this.IsAfreshLogin == true) return;
Application.Current.Shutdown();
base.OnClosed(e);
}
另外,还有一种强制终止应用程序进程的方法
**Environment.Exit(0)**可以立即中断程序执行并退出
这个方法用起来的感觉类似在任务管理器里找到进程并终止,即立刻关闭进程,不管该进程目前有没有工作,在做什么工作。
在WPF中调用该方法即立即退出,不会等待当前工作完成。
需求:需要在许多子窗体中关闭整个程序(WPF)
winform实现:Application.Exit();
关于WPF的退出
如果你在创建项目的时候细心的查看一下项目的结构,你会发现里面有一个App.xaml,一见到App我们知道是应用程序的关键了配置了,当然,WPF的启动窗体也在这里面设置的。
我们可以在App的中配置启动页,如下所示:
当然,我们还可以再App.cs重写OnStartUp来设置要启动的页面来设置启动的页面,如:
// An highlighted block
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
new Login().Show();
base.OnStartup(e);
}
}
程序的退出看着挺简单的,调用App.Current.Shutdown();则程序就退出了,这仅适用于简单的情况,接下来用实际的测试来说话:
在登录窗口,我们给Cancel按钮添加一个事件(以后会详细介绍,现在就双击OK了),然后再里面实现。WPF的退出方法如下所示的:
- this.Close();// 关闭当前窗口,可以在OnClosing和 OnClosed中捕获消息,在OnClosing的时候,可以取消关闭窗口。
Environment.Exit(0);// 强制退出,即使有其他的线程没有结束 - Application.Current.Shutdown();// 关闭当前程序,如果有其他线程没有结束,不会关闭
- App.Current.Shutdown();// 同Application,没有和App区分出来。
代码片
接下来贴出代码:
测试代码如下:
// A code block
var foo = 'bar';
//
public Login()
{
InitializeComponent();
//new MainWindow().Show();
this.Closing += (s, r) =>
{
// 我不是想真的退出,我想保持最小托盘
Debug.WriteLine("I'am running,and change status");
r.Cancel = true;
Debug.WriteLine("I'am backing");
};
this.Closed += (s, r) =>
{
// 退出了啊
Debug.WriteLine("I'am Closed");
};
//new Thread(() => { while (true) { Thread.Sleep(100); Debug.WriteLine("I'am Running"); } }).Start();
}
当我们没有启动新线程的时候,打印的消息如下:
开始的时候,仅仅在Login中调用不同的方法,打印的消息如下所示:
//输出:
//I'am running,and change status
//I'am backing
// 程序没有退出
//this.Close();
//输出:
//没有输出任何消息,没有调用Closed和Closing
// 程序强制退出
//Environment.Exit(0);
//输出:
//I'am running,and change status 执行了方法,但是程序还是强制退出了
//I'am backing
//I'am Closed
// 程序强制退出
//Application.Current.Shutdown();
//输出:
//I'am running,and change status 执行了方法,但是程序还是强制退出了
//I'am backing
//I'am Closed
//force closed
// 程序强制退出
//App.Current.Shutdown();
注意
- 当我们启用新线程的时候,则除Environment.Exit(0),打印几个I’am
Running之后,程序就完全退出了,但是其他的都没有提出系统。 那么Close在什么时候会退出程序呢? - 如过调用了Close,而在Closing中没有显示的取消退出,则系统可以退出,这种情况仅仅是在没有多余线程,没有其他窗口启动的时候,如果有其他窗口同时启动,则要考虑App.Current.ShutdownMode。
如果在App里面显示的或者退出系统之前显示的设置了App.Current.ShutdownMode,此时系统也不会有退出不完全的情况,当系统App.Current.ShutdownMode=OnMainWindowClose的时候,此时如果,调用主窗口的Close,则系统会退出(没有残余线程的情况),即使在主窗口中又弹出了其他的窗口。 - 如果设置了App.Current.ShutdownMode=OnLastWindowClose,则此时系统不会关闭,什么时候关闭呢?所有的弹出窗口都关闭的情况下会退出系统(没有残余线程的情况)。
- 当设置App.Current.ShutdownMode=OnExplicitShutdown的时候,此时较复杂,此时无论什么样的顺序调用Close都不会关闭窗口,必须显示的调用Application.Current.ShutDown()方法,系统才会退出。
总结
退出就是:
Close->Application.Current.ShutDow()->Enviroment.Exit(0)
弱------------------------------------------------------------------------------> 强
Close->退出系统时候要看App的ShutDownModel设置
如果系统有为释放的线程,或者先释放掉,或者调用Enviroment.Exit(0)
强制回收,关闭系统