一篇文章贯通wpf的本质(W我P佩F服)

WPF - 本质:数据和行为

    简述: Windows Presentation Foundation  中文译为“Windows呈现基础”,其原来代号为“Avalon”,因与“我佩服”拼音首字母组合一样,国内有人调侃地称之为“我佩服”。

   WPF是Windows操作系统中一次重大变革,与早期的GDI+/GDI不同。WPF是基于DirectX引擎的,支持GPU硬件加速,在不支持硬件加速时也可以使用软件绘制。高级别的线程绘制可以提高使用者的体验。自动识别显示器分辨率并进行缩放。而Vista就是一个非常典型的例子。

  1. UI本质
  • 先从UI上分析,UI的功能是让用户观察和操作数据,为了能显示数据和响应用户的操作通知程序(通过事件来通知,如何处理事件又是一系列的算法),所以控件就是显示数据和响应用户操作的UI元素,也即:控件就是数据和行为的载体。
  • 一个是数据展现,另一个就是数据操作,也就是UI框架的数据(Data)和行为(Behavior)。
  • 数据驱动UI

       什么是数据驱动UI呢?我们知道传统的GUI界面都是由windows消息通过事件传递给程序,程序根据不同的操作来表达出不同的数据体现在UI界面上,这样数据在某种程度上来说,受到很大的限制。WPF中是数据驱动UI,数据是核心,处于主动的,UI从属于数据并表达数据,是被动的。WPF数据第一,控件第二。

   2.数据(Data)

   以前的UI框架的控件对控件数据类型都有规定,按钮上显示的是文本或者加上一个图片,下拉框显示的都是字符串或者带上一个object类型属性的作为保存 对象引用用。而WPF则不同,它缺省的数据类型为object,这就允许控件能够操作任意类型的数据,这也是它灵活和强大的地方之一。

  •      数据类型

原始数据:字符串、布尔、整形等
列表数据:数组、列表等,集合中的内容可以是相同类型或者不同类型的数据
层级数据:树、列表的列表或者图等,具有层级关系的数据
组合数据:包含以上多种数据的数据,如用户联系方式包括电话、地址1、地址2、手机号等
  但是如果是object类型,那WPF如何知道具体该如何显示这些数据呢?这就要通过Templates、Presenters、Binding and Converters、Layout和Styles了。

  • 模板(Templates)

      控件模板(control template):控件模板定义一个控件的外观,这个控件主要和UI相关,一般也不和Data有关。每个控件都有个一个缺省的控件模板。
      数据模板(data template):数据模板负责定制任何一个.Net对象的外观,这对于非UIElement控件非常重要,非UIElement控件的默认模板仅仅是一个TextBlock,其中包含了一个由ToString方法反会的字符串。

      内容控件(Presenters):
  通过Templates讲解,我们现在知道控件模板定义控件外观,数据模板定义特定的数据如何显示,那么现在如何将定义的数据显示在控件外观上显示呢?那就需要content presenter了。每个控件都有一个默认的ContentPresenter用于显示Content内容,我们称这种控件为内容控件,ContentPresenter负责将ContentControl的Content属性显示出来。

  3.绑定(Binding) 和 转换(Converters)

    数据模板描述了数据显示的外观,我们如何使得这些外观和数据关联起来呢?这就是数据绑定(data binding)来做的事情。WPF的数据绑定是一个强大的功能,它允许单项和双向的绑定,当对象更改时UI会自动刷新,当UI操作后数据也可以自动更改。
有时候数据的格式并不只是简答的显示,比如bool类型需要显示成三态,可以通过一个转换器来实现。 

  Binding和Converters代码示例:网上很多这个资料,可以参考WPF Data Binding、Binding Converters

4. 布局(Layout)
  经过前面的步骤,模板已经定义了,数据也有了,转换器和绑定也触发了,内容显示也生成了,剩下最后一步就是布局(layout)。布局系统将确定前面生产的所有UI控件的大小和位置。在WPF中panel以及其继承类负责提供layout功能。布局是一种递归的分两个步骤进行的过程,第一步叫做检测(measuer),第二步叫做排列(arrange)。

检测:面板询问其子元素到底需要多少空间,这里假设有足够的控件。面板会重载FrameworkElement的MeasureOverride方法来实现这一步。
排列:在检测步骤完成后,就该排列元素了。面板会告诉子元素它们将放在哪里,它们有多少空间可以用。面板会重载FramworkElement的ArrangeOverride方法来实现这一步骤。

5.样式(Style)
  样式是一种简单的机制,通过它可以把属性值和用户界面元素分类开来,有点类似CSS与HTML的关系

以上内容可以表达为下图:Person数据经过控件模板、数据模板以及样式和布局,再加上数据绑定就可以展现数据了。

6. 行为(Behavior)
把数据显示出来只是做了一半工作,还有一半就是提供用户方式与UI进行交互。下图说明了输入操作示意图:

WPF控件支持鼠标、键盘和写字板等输入设备来与UI进行交互,还可以通过外部和内部时间进行操作,经过触发后可以通过事件处理或者command机制来进行Action。

部分内容来自:周金根 [ http://zhoujg.cnblogs.com/ ]

一篇文章贯通wpf的本质(W我P佩F服)相关推荐

  1. 一篇文章搞定各种售后问题,电商客服运营看过来

    随着电子商务发展不断普遍化,客户对网购售后问题更加关注,各电商企业也在不断的努力做好售后问题.同时客户对网购的体验要求不断变高,所以反馈的问题也不断变多,处理售后问题,这成了很多客服非常头疼的事.今天 ...

  2. 一篇文章入门深度学习框架PyTorch

    一篇文章入门深度学习框架PyTorch 1 Tensor(张量) 2 Variable(变量) 3 Dataset(数据集) 4 nn.Module(模组) 5 torch.optim(优化) 一阶优 ...

  3. 一篇文章理解深度神经网络5个常用激活函数

    一篇文章理解深度神经网络5个常用激活函数 1.Sigmoid 2.Tanh 3.ReLU 4.Leaky ReLU 5.Maxout 小结 1.Sigmoid Sigmoid非线性激活函数的数学表达式 ...

  4. 动态规划——01背包问题 看此一篇文章就够了

    本文讲述经典算法--动态规划的 常见问题 01背包  一篇文章带你学会01背包问题,妈妈再也不担心我遇到01背包了!!! 问题描述 有n个物品,它们有各自的体积和价值,现有给定容量m的背包,如何让背包 ...

  5. nmn是个什么东西,一篇文章让您客观了解nmn对身体有什么好处

    nmn是个什么东西,美国w+nmn分享:一篇文章让您客观了解nmn对身体有什么好处!NMN这个词,近几年火遍了全球,号称人类进入抗 衰老界划时代里程碑的NMN究竟是什么,我们一起来了解一下nmn到底是 ...

  6. 一篇文章一张思维导图看懂Android学习最佳路线

    一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...

  7. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  8. 8问8答,一篇文章读懂空间音效

    近日,第一届网易集团创新奖评选落下帷幕,网易智企"逼近人耳极限-音频通话"项目从众多参赛作品中脱颖而出,荣获"0-1创新奖"三等奖. 此次获奖的项目诞生于网易智 ...

  9. 一篇文章了解架构师能力模型

    每一个技术人都有着一个架构师的梦,希望自己有朝一日能登上技术之巅,以下结合我自己13年的从业经验,分别从架构师进阶之路.架构师能力模型(这里是亮点).架构师技能树.架构师业务技能树谈起,完整的剖析一个 ...

最新文章

  1. 首次揭秘!大麦如何应对超大规模高性能选座抢票?
  2. STL学习小记--与C++模板相关的几个特性
  3. clickhouse常用sql
  4. 这个网盘搜索好像还不错
  5. SpaceX完成“星舰”空中悬停,距载人探火星还远吗?
  6. 密码学专题 openssl编译和安装
  7. ZRender源码分析2:Storage(Model层)
  8. ll命令报错-bash: ll: command not found
  9. mybatis 调用 oracle函数_从Oracle到PG 该做的改造工作一个都不能少!
  10. PTA|团体程序设计天梯赛-练习集|JAVA版
  11. Photoshop 使用技巧
  12. HTML5+CSS3教程1
  13. Visio2013 补丁
  14. 头像设计,如何用PS制作个性头像
  15. Ubuntu、Windows双系统下NTFS分区的读写问题
  16. linux 开机运行命令
  17. IntelliJ Idea 常用快捷键列表
  18. 在Linux下搭建带MOD 我的世界(Minecraft)服务器
  19. 获取微信用户信息java开发_Java微信公众平台开发(十二)--微信用户信息的获取
  20. 如何分析公众号后台数据?

热门文章

  1. ReentrantLock 锁详解
  2. C语言 sigchild回收子进程
  3. css3 平行四边形 、大括弧
  4. 用Disk Genius检测和修复硬盘坏道
  5. 安卓修炼之路必要要知道的要求和建议
  6. “麦田音乐节·超时空歌会”即将破空 探索元宇宙虚拟演唱会新形式
  7. 红米2 com.android.phone,红米2手机(移动/联通/电信) 7.1 ROM 下载地址搬运(2017年3月10日更新)...
  8. SDRAM学习(一)——初始化
  9. STM32F105 UC/OS-II (B OSStartHang)问题
  10. Codeup1032-1033、1045