Application类-应用程序生命周期
1、创建Application对象
- 新建WPF程序后,排除掉WPF自动创建的App.xaml,我们自定义一个类,在该类的Main()方法中,创建Application对象,然后调用创建一个窗口对象,最后在Run()方法中,传递这个窗口对象。便完成了一个简单的应用程序的启动。
class AppStart
{
[STAThread]
public static void Main()
{
Application application = new Application();
MainWindow mainWindow = new MainWindow();
application.Run(mainWindow);
}
}
- 当Run()方法中传递一个窗口时,该窗口就被设置为主窗口。我们可以通过Application.MainWidow属性获取到主窗口。
- 调用Run()方法后会触发Application.Startup事件并显示主窗口。
- 当然还有另一种方式启动应用程序:
[STAThread]
public static void Main()
{
Application application = new Application();
MainWindow mainWindow = new MainWindow();
application.MainWindow = mainWindow;
application.Run();
}
2、自定义派生自Application的类
WPF自动会为我们创建一个App.xaml文件,<Applicatin>标签中的Class属性值会为我们创建一个派生自所在标签类型(Application)的类。并且这个类也应该是由两个不可见的partial类型组成。
从反编译结果可以看出自动生成的部分类中带有程序入口方法的Main()。所以该类的结构大致就是:
[STAThread()]
static void Main()
{
App app = new App();
app.InitializeComponent();
app.Run();
} public void InitializeComponent()
{
this.StartupUri = new Uri("MainWindow.xaml",System.UriKind.Relative);
}
而第二部分存储在项目的App.xaml.cs类似的文件中。这一部分由我们自己来添加代码:
public partial class App : Application
{
//添加你的实现
}
3、应用程序的关闭方式
通常只要还有一个窗口没有关闭,Application类就还处于有效状态。
- 可以通过调整Application.ShutdownMode属性来设置应用程序关闭模式。
- 如果Application是手动实例化的,则需要在Run()方法调用前设置ShutdownMode属性。
- 无论使用那种关闭模式,只要调用Application.Shutdown()方法,Application.Run()方法会立即返回,进而终止应用程序。Run()方法返回后,仍然可以在Main()里面处理其它代码或者在Exit事件中处理未完的事情。
4、应用程序事件
虽然,新建的App.xaml.cs中没有任何代码,但是我们仍然可以在其中添加一些代码来响应应用程序事件。下面贴出来一串代码来帮助理解Application类里面的事件。
/// <summary>
/// Application.Run()之后,主窗口显示前发生。
/// </summary>
/// <param name="e"></param>
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
//SplashScreen splashScreen = new SplashScreen("welcome.png");
//splashScreen.Show(false);
//Thread.Sleep(1500);
//splashScreen.Close(new TimeSpan(5000000));
}
/// <summary>
/// 发生在应用程序关闭时,并在Run()方法返回前发生。这是不能取消的关闭。
/// </summary>
/// <param name="e"></param>
protected override void OnExit(ExitEventArgs e)
{
base.OnExit(e);
}
/// <summary>
/// 当程序从后台切换到前台时发生
/// </summary>
/// <param name="e"></param>
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
}
/// <summary>
/// 当应用程序切换到其它Windows程序时发生
/// </summary>
/// <param name="e"></param>
protected override void OnDeactivated(EventArgs e)
{
base.OnDeactivated(e);
}
/// <summary>
///
/// </summary>
/// <param name="e"></param>
protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
{
base.OnSessionEnding(e);
}
Application类-应用程序生命周期的更多相关文章
- iOS Application Life Cycle 应用程序生命周期
应用程序的状态 IOS的应用程序一共有5种状态. Not running(未运行):程序未启动 Inactive(未激活):其他两个状态切换时出现的短暂状态.唯一在此状态停留时间比较长的情况是:当用户 ...
- 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系
(1)设置状态栏的2种方式 --第一种方式就是我们在控制器中设置,系统默认就是交给视图控制器去管理的,这样不同视图控制器能够自己定义不同的状态栏例如以下: -(BOOL)prefersStatusBa ...
- asp.net应用程序生命周期和asp.net网页的生命周期
一.asp.net应用程序生命周期 asp.net应用程序生命周期以浏览器向web服务器(比如IIS服务器)发送请求为起点,先后经历web服务器下的ISAPI(Internet Server Appl ...
- asp.net应用程序生命周期
asp.net应用程序生命周期(流程文字描述版) 请求——>IIS——>ISAPI映射——>交给asp.net(即为IIS的扩展)——>通知Application类创建一个应用 ...
- .net学习笔记----Asp.net的生命周期之一应用程序生命周期
Http请求刚刚到达服务器的时候 当服务器接收到一个 Http请求的时候,IIS (Internet Information Services,互联网信息服务)首先需要决定如何去处理这个请求. 什么是 ...
- (转)iOS应用程序生命周期(前后台切换,应用的各种状态)详解
原文:http://blog.csdn.net/totogo2010/article/details/8048652 iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: ...
- IOS应用程序生命周期&启动周期函数
—程序的生命周期 a.程序的生命周期是指应用程序启动到应用程序结束整个阶段的全过程 b.每一个IOS应用程序都包含一个UIApplication对象,IOS系统通过该U ...
- [译]MVC应用程序生命周期
原文:MVC Application Lifecycle 来一探究竟在MVC应用程序中参与请求处理的各个不同组件. 目录: 序言 背景 UrlRoutingModule RouteHandler Mv ...
- 转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解
iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: iOS开发进阶2012-10-08 15:35 42691人阅读 评论(30) 收藏 举报 iosapplication任务anima ...
随机推荐
- 个人项目:WC
一.GitHub项目地址:https://github.com/lseap/myWC 二.PSP表格: PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...
- X264-应用工程
接下来的几篇博客中,具体学习下X264的实现过程. 源代码的分析参考了雷神的博客,感谢雷神!博客链接:https://blog.csdn.net/leixiaohua1020/article/deta ...
- SUSE12-SP2安装教程(虚拟机)
创建虚拟机,安装系统,安装系统后的系统设置 创建虚拟机 将SUSE12-SP2镜像(大于3G)上传到虚拟机主机存储. 创建虚拟机创建虚拟机,CPU>=8核,内存>=16G(注:我这里仅演示 ...
- Redis缓存实战教程
目录 Redis缓存 使用缓存Redis解决首页并发问题 1.缓存使用的简单设计 2.Redis的整合步骤 A 将Redis整合到项目中(Redis+Spring) B 设计一个数据存储策越 3.Re ...
- 逆向破解之160个CrackMe —— 010-011
CrackMe —— 010 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 06点击事件 tabBar配置 拨打电话
1== D:\wxxm 项目的地址 2==>tabBar在全局配置中 在pages的同级目录下创建images本地图标 (最好的是在远程获取img 因为微信是有大小限制的) selectedIc ...
- linux (07) redis详解
一.redis持久化RDB 1.在配置文件中添加参数,开启rdb功能 redis.conf 写入 port 6379 daemonize yes logfile /data/6379/redis.lo ...
- oracle 行转列~列转行(几种方法)
工作中,我们经常会碰到行转列的情况 这里我介绍几种简单的方法--行转列 1.oracle的pivot函数 原表 使用pivot函数: with temp as(select '四川省' nation ...
- maven settings
maven settings 私有服settigs <?xml version="1.0" encoding="UTF-8"?> <setti ...
- 【目标检测】SSD:
slides 讲得是相当清楚了: http://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdf 配合中文翻译来看: https://www.cnb ...