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内部机制继续做探索,敬请关注!

  如果觉得有帮助,右下角赞一下吧~ (* *)

 

posted @ 2014-06-11 10:37  techlead_krischang  阅读(2172)  评论(5编辑  收藏  举报