2000条你应知的WPF小姿势 基础篇<28-33 WPF启动故事>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师。最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF 。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。Follow他的博客也有一段日子了,很希望能够分享给大家。
本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。
在这里郑重说明.该系列是基于Sean Sexton先生的英文博客, Sean Sexton拥有全部版权和撤销权利。
前文:<1-7>, <8-14>,<15-21>,<22-27>
[小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂。cnblogs.com/xfuture]
#28 WPF入口
对于使用VS新项目创建方式创建的WPF独立应用程序,该程序的入口是定义在App.g.cs(自动生成的代码)的Main方法。在默认的项目配置里,是 public static void App.Main(), 是一个静态方法。
一般来说,一个.net程序的入口是在在其入口类的Main函数,如果一个项目中拥有多个静态的Main方法,则需要在项目属性中配置入口的类。在启动对象下拉框,选择包含Main函数的类,作为启动时调用的类。

#29 在WPF Main()中发生的故事
当你使用VS创建了一个WPF独立程序的时候,VS会自动生成一个继承自System.Windows.Application的App类,里面包含了入口的Main()静态函数。这是定义:public partial class App : Application
在Main()函数中,应用程序通过以下三步来进行启动:
1. 创建一个Application的实例
2. 调用Application.InitializeComponent方法来构建整个应用。
3. 调用Application.Run方法来启动应用。
代码如下:
public static void Main()
{
WpfApplication.App app = new WpfApplication.App();
app.InitializeComponent();
app.Run();
}
#30 单例
System.Application类是单例,意味着你最多在一个WPF Application中创建一个Application的实例,如果你创建了第二个Application的实例,程序就会抛出InvalidOperationException异常。
你可以通过静态属性Application.Current来访问当前的Application类。或者使用派生的App类,App.Current
#31 两种创建WPF控件的方式
在WPF中你可以通过以下两种方式来创建控件:
1. 编程的方式:使用C# code
2. 声明式:使用XAML来声明控件
举个例子: 程序启动需要指定起始的Window。
代码方式:
private void Application_Startup(object sender, StartupEventArgs e)
{
MainWindow win = new MainWindow();
win.Show();
}
Xaml:
<Application x:Class="WpfApplication.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>
两种最终实现的效果相同,打开了MainWindow。
#32 WPF生命周期
WPF Startup Event处理的函数中可以得到传递来的命令行参数并且进行处理。
命令行的参数可以在StartupEventArgs.Args找到。args是传入的命令行参数的string 数组。
代码如下:
private void Application_Startup(object sender, StartupEventArgs e)
{
foreach (string s in e.Args)
{
MessageBox.Show(string.Format("Arg: {0}", s));
}
}
其实一般做法是重写其OnStartup方法来代替其startupevent handler
protected override void OnStart(string[] args) { }
#33 监听Windows会话
当一个用户关闭Windows或者机器的时候,WPF可以监听到其事件并可以发出警告。事件名称为Application.SessionEnding,在用户注销和关机时触发。
通过设置SessionEndingCancelEventArgs.Cancel 为true,可以阻止其注销/关机行为:
private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e)
{
MessageBoxResult res = MessageBox.Show("Exiting Windows will terminate this app. Are you sure?", "End Session", MessageBoxButton.YesNo);
if (res == MessageBoxResult.No)
{
e.Cancel = true;
}
需要注意的是,这个事件是windows停止时触发,并不是该WPF应用程序关闭时触发。
在Win7以上系统,如果你的应用取消了SessionEnding的事件,Windows会通知你你的应用程序阻止了其关机:

后篇会对WPF内部机制继续做探索,敬请关注!
如果觉得有帮助,右下角赞一下吧~ (* *)
2000条你应知的WPF小姿势 基础篇<28-33 WPF启动故事>的更多相关文章
- 2000条你应知的WPF小姿势 基础篇<15-21>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...
- 2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励.现在开始继续做WPF2000系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
随机推荐
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- jQuery动画-圣诞节礼物
▓▓▓▓▓▓ 大致介绍 下午看到了一个送圣诞礼物的小动画,正好要快到圣诞节了,就动手模仿并改进了一些小问题 原地址:花式轮播----圣诞礼物传送 思路:动画中一共有五个礼物,他们平均分布在屏幕中,设置 ...
- [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office
打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...
- 几个有趣的WEB设备API 前端提高B格必备(一)——电池状态&震动api
受到同事启发,突然发现了几个有趣又实用的web api,没想到前端还有这么多有趣的东西可以玩~~简直过分. 1.电池状态API navigator.getBattery():这个api返回的是一个pr ...
- 开源一款简单清爽的日历组件,JavaScript版的
源码会在最后给出地址,需要的朋友自己去下载.最近项目需要做一个日程安排的功能,就是点击日历的某一天弹出一个录入页面,填完信息后保存当天的日程安排.有日程的日期会有不同的标记(比如加一个背景色啥的).网 ...
- MongoDB集群配置
本文演示:(一个主服务器,一个备份服务器,三个仲裁服务器) 官方推荐副本集的成员数量为奇数,最多12个副本集节点,最多7个节点参与选举. 本文演示基于本机,用端口区分服务(每个服务器下新建db文件夹用 ...
- javaScript生成二维码(支持中文,生成logo)
资料搜索 选择star最多的两个 第一个就是用的比较多的jquery.qrcode.js(但不支持中文,不能带logo)啦,第二个支持ie6+,支持中文,根据第二个源代码,使得,jquery.qrco ...
- SAP自定义权限对象
SAP系统自带了很多的权限对象,每一个运行画面都有非常多的权限用到.不过标准的权限对象并不一定适合于用在客户自己开发的程序里面,所以每个ABAPer都应该会自己开发一套权限对象,并引用在程序代码里面. ...
- Android之网络数据存储
一.网络保存数据介绍 可以使用网络来保存数据,在需要的时候从网络上获取数据,进而显示在App中. 用网络保存数据的方法有很多种,对于不同的网络数据采用不同的上传与获取方法. 本文利用LeanCloud ...
- Idea下用SBT搭建Spark Helloworld
没用过IDEA工具,听说跟Eclipse差不多,sbt在Idea其实就等于maven在Eclipse.Spark运行在JVM中,所以要在Idea下运行spark,就先要安装JDK 1.8+ 然后加入S ...