首先,在这里我要说明的是:这里的例子,都是通过控制台程序来创建WPF应用,而非使用现成的WPF模版。因为WPF模版封装了创建WPF应用所需要的各种基本元素,并不利于我们学习。

  创建一个WPF需要引用的最基本的DLL

  1、PersentationCore WPF的核心类库

  2、PersentationFramework 封装了与WPF控件相关类型的类库

  3、System.Xaml XAML解析的类库

  4、WindowBase Window窗体相关的类库

  引入了这四个类库之后 我们就可以创建自己的WPF App了

  Demo:

class SimpleWPF
{
//与Console、Winform一样 WPF自身也是单线程模型
[STAThread]
static void Main()
{
//Window 是WPF中标准的窗体呈现方式
Window mainWindow = new Window();
mainWindow.Title = "这是一个简单的WPF应用"; //Application类型用于创建一个消息循环 使用户可以接受来自输入设备的输入
Application app = new Application(); Console.WriteLine("Simple WPF Running"); app.Run(mainWindow); #region 等效方式 //mainWindow.Show();//显示窗体
        //app.Run();//先建立消息循环
#endregion } }

  在这个例子里 大家应该可以看到 在单线程的主入口点中,我声明了一个Window对象 和一个Application对象。

  这两个对象是做什么的呢?我在这里解释下

  System.Windows.Application对象 是创建一个消息循环,用以接受用户的各类输入事件,以及阻止控制台程序的结束

  System.Windows.Window对象 是WPF中标准的窗体类型。

  这里提供了一个继承关系的树形截图

  

  从此截图可以看出 Window类型实际是一个ContentControl类型。 对于Control类型的讲解,我们会后期的文章中说明

  Window类型还有一个孪生兄弟 叫UserControl,位于System.Windows.Controls命名空间下,UserControl与Window不同,Window会被视为窗体,而UserControl顾名思义被视为一个封装好的用户控件。

  Application在运行的时候,可以创建一个默认Window窗体并直接调用窗体的Show()方法进行显示,也可以由Window调用自己的Show()并调用Application的Run()方式来完成窗体的显示以及消息循环的建立。同时Application会将第一个调用了Show()的窗体认作MainWindow 并可以通过Application的MainWindow属性获取及设置新的MainWindow

  因为程序是通过控制台来创建的GUI,我们在运行时除了会看到Window窗体,还会看到Console控制台。我们可以通过Console.WriteLine()来输出各类调试信息,因此在程序发布之前 建议使用这种方式来进行调试。如果不希望看到Console,可以修改项目属性为Windows应用程序,如下图

  

  以上就是如何创建一个简单的WPF应用了,很多人可能还会疑惑,这么创建的WPF应用程序跟拿模版创建的差距咋就那么大呢,下面我用一个例子来告诉大家,模版都做了什么,它的好处在哪。

  

这是一个模版生成的WPF应用程序。

我们来模拟它

  MainWindow 我们只关心他的cs文件, MainWindow类型也是继承自Window类型,在MainWindow类型里 我们可以重写On[Event]行为来达到对各种Window窗体的事件的处理

  App 分为两部分 一部分为Xaml 其中有个重要的属性StarupURI 定义了主窗体的类型,另一部分是App.Xaml.cs 继承自Application类型,让我们可以使用Application生命周期中产生的各种事件

  App生命周期中有三个特别重要的事件

  OnStartup 创建消息循环时触发

  OnExit 结束消息循环时触发

  OnSessionEnding 系统进行关机操作时触发

  在这个例子里 我们将对窗口的创建 延迟到了Application 的 Startup事件中,也就是由Application来管理窗体的创建和销毁

  上代码:

  主入口点 负责创建Application消息循环

class Programs
    {
        [STAThread]
        static void Main()
        {
            App app = new App();

Console.WriteLine("App.Run()");

app.Run();
        }
    }

Application类,我们在Stratup事件中创建Window实例,并且向控制台中输出创建信息

 public class App : Application
{
/// <summary>
/// 程序运行时触发的事件
/// </summary>
/// <param name="e"></param>
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e); WPF_ApplicationAndWindow.NormalWPF.MainWindow mainWindow = new MainWindow(); Console.WriteLine("Application StartUp And Main Window.Show()");
mainWindow.Show();
} //关机时触发的事件
protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
{
base.OnSessionEnding(e); Console.WriteLine("Session Ending");
} //退出WPF时触发的事件
protected override void OnExit(ExitEventArgs e)
{
base.OnExit(e); Console.WriteLine("Exit Application");
}
}

  Window 这个就不多说啥了

public class MainWindow : Window
{
public MainWindow()
{
this.Title = "MainWindow"; }
//获取鼠标在窗体内的点击事件
protected override void OnMouseDown(System.Windows.Input.MouseButtonEventArgs e)
{
base.OnMouseDown(e); //由于此窗体就是接受事件的窗体 所以这里用This
string message = string.Format("MouseDown on Point {0}", e.GetPosition(this)); //输出控制台
Console.WriteLine(message); MessageBox.Show(message, this.Title);
}
}

  Application对象常用属性

  1、MainWindow

  获取当前Application中的主窗体,如果不进行修改,默认获取到的是第一个调用Show()的窗体对象

  2、Windows

  获取当前Application管理的所有窗体实例 集合类型

  3、ShutdownModel

  这是一个枚举类型,用以决定何时应该结束这个Application的声明周期,枚举值有三个

  OnExplicitShutdown 只有在调用Application.Shutdown()方法时 才能结束生命周期

  OnLastWindowClose 当Application所管理的所有窗体都关闭时 结束生命周期

  OnMainWindowClose 当Application所管理的MainWindow关闭时 结束生命周期

  4、Current (Static)

  这是一个静态属性,直接通过Application.Current获取,这个属性获取了当前使用的Application实例

  Window对象的常用属性

  1、Owner

  设置当前实例化的窗体隶属于哪个窗体,当设置此属性后,当前实例化窗体会受设置的窗体管理,具有相同的生命周期,并且会一直显示在设置的窗体前面

  2、Owners

  获取当前窗体所拥有的所有子窗体列表

  3、ShowInTaskBar

  这是一个bool类型,决定窗体是否会显示在Windows任务栏中

  4、WindowStartupLocation

  枚举类型,决定了窗体初始显示位置

  5、WindowStyle

  枚举类型,决定了窗体边框类型 默认为SingleBorderWindow 拥有一个最大化、最小化、关闭按钮

  6、WindowState

  枚举类型,决定了窗体在Show()之后的显示方式 默认为Normal 最大化 最小化 还是正常显示

WPF的架构分析的更多相关文章

  1. VSTO学习笔记(七)基于WPF的Excel分析、转换小程序

    原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...

  2. tomcat架构分析 (Session管理)

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  3. Magento架构分析,Magento MVC 设计分析

    Magento架构分析,Magento MVC 设计分析 分类:Magento 标签:Magento MVC.Magento架构 669人浏览 Magento 采用类似 JAVA的架构,其扩展与稳定性 ...

  4. Flickr 网站架构分析

    Flickr 网站架构分析 Flickr.com 是网上最受欢迎的照片共享网站之一,还记得那位给Windows Vista拍摄壁纸的Hamad Darwish吗?他就是将照片上传到Flickr,后而被 ...

  5. Android架构分析之Android消息处理机制(二)

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...

  6. NopCommerce架构分析(转载)

    原文 一,NopCommerce架构分析之开篇 NopCommerce是.net开源项目中比较成熟的一款业务应用框架,也是电子商务系统中的典范.所以很想多学习一下里面的设计和实现方式. 二,NopCo ...

  7. Qualcomm Android display架构分析

    Android display架构分析(一) http://blog.csdn.net/BonderWu/archive/2010/08/12/5805961.aspx http://hi.baidu ...

  8. tomcat架构分析-索引

    出处:http://gearever.iteye.com tomcat架构分析 (概览) tomcat架构分析 (容器类) tomcat架构分析 (valve机制) tomcat架构分析 (valve ...

  9. [转载] 关于“淘宝应对"双11"的技术架构分析”

    微博上一篇最新的关于“淘宝应对"双11"的技术架构分析”.数据产品的一个最大特点是数据的非实时写入.

随机推荐

  1. NIO的工作方式

    BIO带来的挑战 BIO 就是我们常说的阻塞I/O , 不论磁盘I/O 还是网络/O ,数据在写入OutputStream 或者从 InutStream 读取数据时都有可能会阻塞,一旦有了阻塞,线程就 ...

  2. 安装windows 10到固态硬盘实践记录

    1.前提 由于之前一直用的机械硬盘,电脑用了几年是越来越慢,所以打算买个SSD,装个新系统,其他的机械硬盘都当从盘用 2.准备工作 SSD :256G 3星的 WIN10正版光盘一张 外置光驱一个 3 ...

  3. python3 发生器 迭代器 内置函数 协程 哈哈我又回来啦

    唉 犯傻了,干了一件虽有一点点道理的事情,但是却完全没有效果,我是不是傻,浪费了这么多时间在一件不可能的事情上,果然效果比道理更重要... 被一些琐事耽搁几天,python的学习都给我停了,擦!不过一 ...

  4. 实地探访:月薪 12K 的北京程序员是怎么工作生活的?

    阅读本文大概需要 4 分钟. “ 每个人都有自己的亲身经历,每个人都有一条生活道路.千万人千万条,各不相同,各有特点.但是并不是好人都有一条好路,坏人都有一条坏路,有的时候却恰恰相反.这虽然不是历史的 ...

  5. 【朝花夕拾】Android性能篇之(八)ANR篇--草稿

    1.ANR概念 2.ANR发生场景 Android开发者官网 上说到了两个原因:(1)点击按键或者触摸屏幕等输入事件在5s内没有响应:(2)10s内没有完成广播事件.如下所示: Android wil ...

  6. Spring:(一)入门基础学习

    前述 因为前几日刚刚学完Spring的基础,因此写一篇博客整理一下相关的基础知识. 什么是Spring? Spring 是一个轻量级的 DI / IoC 和 AOP 容器的开源框架,帮助分离项目组件之 ...

  7. Fescar(Seata)-Springcloud流程分析-1阶段

    Fescar是阿里18年开源的分布式事务的框架.Fescar的开源对分布式事务框架领域影响很大.作为开源大户,Fescar来自阿里的GTS,经历了好几次双十一的考验,一经开源便颇受关注.今天就来看了F ...

  8. WPR003N变成尸体的后记

    这是一个很悲哀的标题,尽管本来不想说还是打算写出来. 应小便的要求本文不加任何字体变化,不设置玄关来等大家破解,只是很自然的把悲剧和大家分享一下. 自上回2019 Valentine's Day 圣地 ...

  9. Java_基础篇(杨辉三角)

    对于刚刚学Java的同学来说,杨辉三角是一个很好的例子. 杨辉三角让初学者更好的理解数组的定义和更好地去运用数组,特别是二维数组. 除此之外,还让初学者更好的掌握嵌套语句的使用. 以下是我的杨辉三角J ...

  10. python 正则验证 IP地址与MAC地址

    #coding=utf-8 import re def isValidIp(ip): if re.match(r"^\s*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} ...