关于WPF的退出
如果你在创建项目的时候细心的查看一下项目的结构,你会发现里面有一个App.xaml,一见到App我们知道是应用程序的关键了配置了,当然,WPF的启动窗体也在这里面设置的。
我们可以在App的中配置启动页,如下所示:
当然,我们还可以再App.cs重写OnStartUp来设置要启动的页面来设置启动的页面,如:
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区分出来。
接下来贴出代码:
测试代码如下:
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)
强制回收,关闭系统。
关于WPF的退出的更多相关文章
- WPF中退出时显示是否保存数据提示
一.通过窗体中的按钮实现退出时数据保存提示 Xaml: <Grid> <TextBlock HorizontalAlignment="Left" Margin=& ...
- 【WPF】退出应用时的提示弹窗
需求:按MainWindow右上角的[X]想要退出软件时,弹窗提示是否确定要退出. 主界面(ShellWindow)的前台给主界面窗体添加两个事件:Closing和Closed <Window ...
- WPF的退出
很多时候,会自己写退出程序的代码. 比如,先显示登录框(LogIn),成功后隐藏它,并显示一个主窗体(MainWin),或者外部还调用了其他App,当你关闭MainWin不一定会直接退出整个程序的. ...
- 2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- WPF直接用Window.Close直接关闭窗口导致不能完全退出的问题
前几天我在CSDN扔了一个问题,基本描述一下:写了一段这样的代码,来实现获取Control的template,却发现一个这样的问题,就是当我打开了一个window以后,手动调用Close(),窗口的确 ...
- C# Note11:如何优雅地退出WPF应用程序
前言 I should know how I am supposed to exit my application when the user clicks on the Exit menu item ...
- WPF 基础 - 启动与退出及异常捕获
1. 若需要控制 exe 实例数量 bool ret; mutex = new System.Threading.Mutex(true, exename, out ret); if (!ret) { ...
- WPF PasswordBox鼠标进入时程序异常退出的解决办法
最近在开发了一个程序中用到了PasswordBox控件,但是在程序给别人用的时候,鼠标一进入控件时程序就异常退出,查了下windows日志,错误显示如下: 应用程序: WpfPasswordTest2 ...
- WPF 屏蔽Alt+F4强制退出
if (e.KeyStates == Keyboard.GetKeyStates(Key.F4) && Keyboard.Modifiers == ModifierKeys.Alt) ...
随机推荐
- (转载)Autodesk面试技术题解答
Autodesk面试技术题解答 By SmartPtr(http://www.cppblog.com/SmartPtr/) 近一年以来,AUTODESK的面试题在网上是闹的沸沸扬扬, ...
- asp.net froms 移动平台(iphone 微信)无法存储的解决办法。
更改form的默认设置,让系统不再根据设备来判断是否支持cookie 在站点的配置文件中有关于Form认证的配置,在配置<authentication mode="Forms" ...
- 转载:开发者眼中最好的 22 款 GUI 测试工具
对于很多同学来说gui程序的测试是一个难点,所以我从网上转载了一篇关于gui测试的一篇文章,里面罗列的很多工具,大家可以尝试一下学习学习. 英文原文:22 best GUI testing tools ...
- jquery 常用插件
50款最有用的 jQuery 插件集锦<表单篇> 50款最有用的 jQuery 插件集锦<网页布局篇> 50款最有用的 jQuery 插件集锦<内容滑块篇> 50款 ...
- [C++] socket - 3 [线程简单例子 代码]
#include<windows.h> #include<stdio.h> DWORD WINAPI myfun1(LPVOID lpParameter);//声明线程函数 D ...
- 【WEB API项目实战干货系列】- 导航篇(十足干货分享)
在今天移动互联网的时代,作为攻城师的我们,谁不想着只写一套API就可以让我们的Web, Android APP, IOS APP, iPad APP, Hybired APP, H5 Web共用共同的 ...
- 免费好用的web应用托管平台-续
上一篇博客给大家推荐了目前处于免费阶段的PAAS平台,可以托管各种应用,大家反响很不错,说明大家还是很需要和认可这个免费托管各种web应用的京东云擎平台.但是很多用户还是很担心未来可能还是会收费,对于 ...
- 使用jquery实现简单的拖动效果,分享源码
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkEAAAERCAIAAADzAOSQAAALRklEQVR4nO3dW5LaaAKEUfa/NkfMGu
- paip.数组以及集合的操作uapi java php python总结..
paip.数组以及集合的操作uapi 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/att ...
- CentOS 6.5 无网环境安装R及Rstudio的方法的方法
在生产环节,一般是不联网的,下面介绍在无望环境如何安装R及R-studio 1. 安装CentOS for R语言的基础环境 1.1 libpng,X11,libjpeg等支持 yum -y ins ...