博客园WPF Application类

所有的WPF程序,都是由Application类实例创建,该类负责打开当前应用程序和窗体,并且决定如何关闭应用程序等。Application类的主要功能可以简单总结以下几点:

1、保持主线程

使用Application后,只要有窗体没有退出,则应用程序不会退出,他会重新定义出新的主窗体,只有所有的窗体都关闭,Appliction才决定是否退出应用程序。Application起到管理所有窗体的作用。看如下代码:

class Program
{
     [STAThread()]
     static void Main(string[] args)
     {
         Application app = new Application();
         Window win = new Window();
         app.Run(win);
     }
}

效果会开启一个应用程序,假如我们不使用Application ,代码如下:

class Program
{
     [STAThread()]
     static void Main(string[] args)
     {
        Window win = new Window();
         win.ShowDialog();
     }
}

感觉效果上,没有任何差别,但实际上,两个完全不一样,假如我们定义一个MainWindow的类,在这个类中放一个按钮,弹出另外一个窗体,效果会怎么样呢,看如下代码:

class Program
   {
       [STAThread()]
       static void Main(string[] args)
       {
           Application app = new Application();
           Window win = new Window();
           win.MouseDown += Win_MouseDown;
           win.ShowDialog();
           app.Run();
       }
      private static void Win_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
       {
           Window win = new Window();
           win.Show();
       }
   }

当我们关闭父窗体,应用程序并没有退出。如果将Application去掉,编写以下代码:

class Program
    {
        [STAThread()]
        static void Main(string[] args)
        {
            Window win = new Window();
            win.MouseDown += Win_MouseDown;
            win.ShowDialog();

        }

       private static void Win_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            Window win = new Window();
            win.Show();
        }
    }

我们关闭父窗体,则整个应用程序退出。

这说明Applicationn在有任何一个窗体存在的情况下,能保证软件的持续运行,保证主线程不退出。

2、启动xaml窗体

我们可以通过指定StartupUri ,来告诉Appliction如何启动窗体,其代码如下:

class Program
{
     [STAThread()]
     static void Main(string[] args)
     {
         Application app = new Application();
         app.StartupUri = new Uri("MainWindow.xaml",System.UriKind.Relative);
         app.Run();
     }
}

所以,我们在编写wpf应用程序的时候,会有一个App.xaml的文件,其就是Appliction的定义,看看其代码如下:

<Application x:Class="Ani.App"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:local="clr-namespace:Ani"
              StartupUri="MainWindow.xaml">
</Application>

也是通过指定StartupUri属性,启动窗体,那Application是如何启动的呢,我们可以在当前程序的obj目录下面,可以看到App.g.cs文件,打开里面的代码,可以看到如下代码:

public partial class App : System.Windows.Application {
     /// <summary>
     /// InitializeComponent
     /// </summary>
     [System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
     public void InitializeComponent() {

         #line 5 "..\..\App.xaml"
         this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);

         #line default
         #line hidden
     }
     /// <summary>
     /// Application Entry Point.
     /// </summary>
     [System.STAThreadAttribute()]
     [System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
     public static void Main() {
         Ani.App app = new Ani.App();
         app.InitializeComponent();
         app.Run();
     }
}

所以WPF应用程序会主动给我们创建一个主程序App.cs和一个App.xaml文件,但App.cs并没有对编辑器放开,我们只需要编辑App.xaml文件即可

3、应用程序的关闭方式

Application里面有一个ShudonwModel属性,这个属性是一个枚举对象,用于指定当前应用程序的关闭方式,其有三个选项。

OnLastWindowClos e 默认行为,只要至少一个窗体存在,应用程序就保持运行状态,应用程序会根据窗体的开启循序,自动指定主窗体。
OnMainWindowClose 这个是指,只要主窗体(最新开启)存在,应用程序才保持运行状态
OnExplicaitShutdown 除非调用Appliction.Shutdown()方法,否则应用程序不会结束。

代码如下:

<Application x:Class="Ani.App"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:local="clr-namespace:Ani"
              StartupUri="MainWindow.xaml" ShutdownMode="OnLastWindowClose">
</Application>

4、应用程序的事件

Application提供了为数不多几个事件,但这几个事件非常有用。

4.1 Startup

这个事件在调用Appliction.Run()方法之前,并且在主窗体显示之前发生,可以使用这个事件读取当前应用程序的命令行参数,而且还示意使用该事件指定StartupUri 属性

4.2 Exit

事件发生在应用程序关闭时(不管是什么原因关闭),并在Run()方法返回之前发生,但此时已经不能取消关闭,但是可以通过Run()方法重新启动程序。

4.3 SessionEnding

该事件在window对话结束时发生,例如,当用户关闭或者注销计算机时,我们来确定是否关闭应用程序,我们可以设置SessionEndingEventArgsCancel属性设置为true来取消关闭应用程序。否则,当事件处理结束后,WPF会调用Application.Shutdown()方法关闭事件。

4.4 Activated

激活当前应用程序的时候调用,当从另外一个应用程序切换到当前应用程序的时候调用,当第一次显示窗体的时候调用

4.5 Deactived

当取消激活应用程序中的窗体的时候,触发该事件。当切换到另外一个应用程序时,调用该事件。

4.6 DispatcherUnhandledException

当应用程序中的任何位置,只要发生未处理的异常,就会发生该事件,使用该事件来记录重要错误。

5、处理命令行参数

为了处理命令行参数,需要响应Application.Startup事件。命令行参数以参数通过StartupEventArgs.Args属性作为字符串数组提供。

public partial class App : Application
{
     private void Application_Startup(object sender, StartupEventArgs e)
     {
         if (e.Args.Length > 0) {

            foreach (var arg in e.Args) {

                Console.WriteLine(arg);
             }
         }
     }
}

6、负责窗体之间的交互

我们可以通过Application的current属性,获取当前的Appliction,也可以通过Application的MainWindow属性,获取当前的主窗体,所以,可以通过Application访问当前的Application里面的数据,同时可以访问主窗体的数据。我们可以将一些全局信息,定义在Application中,那么应用程序在任意位置都可以访问,实现所有窗体互相交互,如下代码:

public partial class App : Application
{
     public List<string> Globals = new List<string>();

     private void Application_Startup(object sender, StartupEventArgs e)
     {
         ((App)Application.Current).Globals.Add("hello");
     }
}
时间: 2024-08-05 09:11:50

博客园WPF Application类的相关文章

利用 进行Json对象的序列化和反序列化 - RJ - 博客园

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 - RJ - 博客园 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 进行Json对象的序列化和反序列化 - RJ - 博客园,bubuko.com" href="http://www.bubuko.com/infodetail-217182.html" target=_blank>利用 进行Json对象的序列化和反序列

网络采集软件核心技术剖析系列(1)---如何使用C#语言获取博客园某个博主的全部随笔链接及标题

一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者. 本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决思路和界面开发的编程经验,非常适合.NET开发的初级,中级读者,希望大家多多支持. 很多初学者常有此类困惑,“为

利用http协议发布博客园博文评论

本博文承接<php 利用socket发送GET,POST请求>,要利用上文封装好的Http类,考虑如何通过php脚本给博客园的博文提交评论. 原理: 在做这件事前,我们首先要明白,给博文提交评论的实质就是通过http协议服务器发送一个post请求.在发布评论前,我们需要做什么呢?对,是必须要登录的.但登录是另一件事情,我们这里先不讨论.用户登录后,服务器给客户端设置一个cookie.http是无状态的.也就是说客户端向服务器发送请求后,服务器返回响应.一次通信完成.服务器不会记得刚才是谁向自己

博客园客户端UAP开发随笔 -- 适配不同尺寸的屏幕

Windows 8诞生之初,Modern apps被设计在运行于全屏模式下.为了让Windows在运行Modern app时继续拥有前台多任务能力,Windows引入了一种全新的分屏技术“SnapView”.它允许将支持这种视图的Modern app贴在屏幕一边,以1/4 (实际上是逻辑分辨率宽度333左右)屏幕尺寸运行.这种视图特别适于工具类应用(如词典)和即时通讯类应用(如QQ).分屏多任务也成了Windows 8区别于iPad和安卓Pad系统的重要特征. 当时程序员在考虑Modern Ap

博客园客户端UAP开发随笔--自定义控件的左膀右臂

前言 我们上一次说到了App的精灵:自定义控件.这一次,我们接着这一话题,说说自定义控件的两个得力助手: 选择器 - TemplateSelector 转换器 – Converter 这两个东西能帮助自定义控件更为简单方便地被使用,所以必须掌握. 数值转换器 Converter 这个大家可能不陌生,因为在MSDN里,介绍到Data Binding时,总会顺带着介绍一下数据转换,比如这个网页: http://msdn.microsoft.com/library/windows/apps/xaml/

PHp + socket编程练习——博客园回复

因为也是学习的路上,先画出思路,代码和看别人的学习的,最后是根据的思路完成的,可能比较简单,后期在去完善和更改 <?php /** * php+socket 编程 发送HTTP请求 * @version c.php * 模拟博客园评论 */ interface Proto{ // 连接url public function conn($url); // 发送get请求 public function get(); // 发送post请求 public function post($body);

博客园客户端(Universal App)开发随笔 -- App的精灵:自定义控件

前言 拿到一个App的需求后,对于前端工程师来说,第一步要干什么?做Navigation规划!第二步要干什么?做页面分解!页面分解如何做?首先要确定UI Element的容器,其次要抽象UI Element本身,也就是要做一堆自定义控件,最终组成整个页面.今天我们就说说自定义控件如何实现吧. 感性认识 在我们的博客园UAP的Windows Phone的版本中,一个最重要的自定义控件就是PostControl,它的样子如下图中红色矩形内所示. 这个控件在无数页面中都要用到,而且有几种变种.上面看到

实用scrapy批量下载自己的博客园文章

首先,在items.py中定义几个字段用来保存网页数据(网址,标题,网页源码) 如下所示: import scrapy class MycnblogsItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() page_title = scrapy.Field() page_url = scrapy.Field() page_html = scrapy.Field() 最重要的是我

博客园加密登录--jsencrypt

博客园加密登录--jsencrypt 问题由来    前几天在做项目的时候,发现一般做登录的时候只是一个非常简单的`form`表单,但是这样肯定是不安全的!所以想去看看其他比较流行的网站是怎么实现的.说到安全,我第一个想到的就是去看支付宝,毕竟人家那么大的系统并且管理的是money啊! 结果,支付宝的登录确实复杂,chrome的F12竟然找不到.算了,看看我大博客园吧! 下面就是从博客园登录页面copy下来的js登录代码片段 博客园登录时采用的ajax发信http登录请求,就是采用jsencyp