WPF关闭应用程序,释放Window窗口资源方法

时间:2024-04-14 08:14:55

WPF关闭应用程序,释放Window窗口资源方法

  1. WindowsForm里一个Application.Exit();方法就可以关闭应用程序,释放掉资源。
  2. 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的中配置启动页,如下所示:
WPF关闭应用程序,释放Window窗口资源方法

当然,我们还可以再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(); 

注意

  1. 当我们启用新线程的时候,则除Environment.Exit(0),打印几个I’am
    Running之后,程序就完全退出了,但是其他的都没有提出系统。 那么Close在什么时候会退出程序呢?
  2. 如过调用了Close,而在Closing中没有显示的取消退出,则系统可以退出,这种情况仅仅是在没有多余线程,没有其他窗口启动的时候,如果有其他窗口同时启动,则要考虑App.Current.ShutdownMode。
    如果在App里面显示的或者退出系统之前显示的设置了App.Current.ShutdownMode,此时系统也不会有退出不完全的情况,当系统App.Current.ShutdownMode=OnMainWindowClose的时候,此时如果,调用主窗口的Close,则系统会退出(没有残余线程的情况),即使在主窗口中又弹出了其他的窗口。
  3. 如果设置了App.Current.ShutdownMode=OnLastWindowClose,则此时系统不会关闭,什么时候关闭呢?所有的弹出窗口都关闭的情况下会退出系统(没有残余线程的情况)。
  4. 当设置App.Current.ShutdownMode=OnExplicitShutdown的时候,此时较复杂,此时无论什么样的顺序调用Close都不会关闭窗口,必须显示的调用Application.Current.ShutDown()方法,系统才会退出。

总结

退出就是:
Close->Application.Current.ShutDow()->Enviroment.Exit(0)
弱------------------------------------------------------------------------------>
Close->退出系统时候要看App的ShutDownModel设置
如果系统有为释放的线程,或者先释放掉,或者调用Enviroment.Exit(0)
强制回收,关闭系统