WPF是什么

WPF是基于Windows的用户界面框架,划重点:基于Windows,用户界面框架。

需要注意的是,WPF仅仅是有关于用户界面渲染的技术,而后台的开发,与系统的交互等都需要.NET Framework 的支持。

为什么写这一系列教程

在写这一系列教程之前,我去逛了逛论坛,对WPF一如既往的唱衰之声,而其核心问题,就是它不能跨平台,那么WPF究竟还有没有其存在的价值呢?

我在很多城市有过一些考察,发现WPF是一项很神奇的技术,一方面很多公司的桌面软件还保持着90年代Windows窗体质朴的本色,他们说WPF没有用,我这个WinForm写的软件用的就很好,而且我以后的发展是在线上。另一方面,稍微有实力的公司,无法忍受WinForm质朴的界面选择了WPF,却因为自己的客户中很多Mac用户吐槽其没有Mac版,而认为WPF不能跨平台的特性是硬伤,最终选择使用QT,C++重写软件(毕竟这些公司也不差钱),笔者也因为类似的原因对于分享一些WPF相关的技术一拖再拖。

刺激到我的是在研究跨平台桌面软件开发的过程中使用Electron而学习了vue,学的过程中,我的反应是:这不是WPF中的绑定么,这里能不能写转换器呢?我才发现,WPF中MVVM深入骨髓,而前端,也经历了由事件驱动到数据驱动的变革,甚至这门08年发布的框架中的很多很好用的特性在前端框架中至今没有得到实现(相信以后会越来越好)。本着学习的角度,了解这门技术本身就是很有意义的。

所以我决定将这一系列的教程写出来,让有需要的人能够了解这门技术,让真正需要使用它的朋友能够能够提高,相信这一部分人看了这一系列教程一定能发现一些之前没有用过的好特性。

评价

WPF是Windows95以来对Windows界面影响最深刻的技术。

旧技术

  • User32 绘制窗口,按钮,文本框控件等
  • GDI/GDI+ 图像渲染,绘图支持

新的图像引擎

DirectX,这个引擎起初是为了游戏开发设计,拥有强大的性能和复杂的API,WPF开发的Windows程序底层使用了DX进行渲染,极大程度的利用了显卡的性能。

硬件加速

WPF为了适配不同的机器,提供了三个不同的渲染级别

  • Rendering Tier0 显卡不提供硬件加速
  • Rendering Tier1 显卡提供部分硬件加速
  • Rendering Tier2 所有性能硬件加速
// 获取渲染级别
int renderingTier = (RenderCapability.Tier >> 16);
MessageBox.Show("渲染级别为:" + renderingTier.ToString());

分辨率无关

WPF根据系统的DPI进行缩放,可以解决传统的GDI绘图在分辨率较高的屏幕上画面紧缩的问题。设置系统的DPI,WPF绘制的图形会自动进行缩放。这里我们扩展一点知识:分辨率指的是显示屏在长宽上面拥有的像素个数,DPI指的是每英寸的点数,那我们可以发现,分辨率加大的时候,DPI加大。我们经常看到的在分辨率减少的情况下,窗口变大就是分辨率有关的事实。WPF要做到在分辨率变高的时候,窗口的大小不变,这就需要WPF根据系统的DPI动态的绘制窗口的大小。算法是这样的

[物理尺寸] = [设备无关的尺寸] * [系统DPI]

设备无关的尺寸是WPF内部定义的,这样就保证了在不同分辨率下的缩放。

设备无关的尺寸定义为1/96英寸,从上面的公式可以看到,当DPI=96的时候,WPF的一个单位就是一英寸。

细说分辨率无关

很多人都听过WPF分辨率无关的特性,但是细问之下却不能说出这个分辨率无关到底指的是什么,上面我们举了例子,但是可能还有一些同学并不知道这其中的意思,那么下面我们用最通俗易懂的几个问题解释下WPF做了什么。

  1. 当我们在WPF中写一个按钮的长度为100px的时候,这个px(像素)指的是多大呢?也就是说 WPF 中的1px是多大呢?

    回答是,不一定!这个不一定就是微软宣传的分辨率无关。WPF中的px不是我们在学习LED屏的时候说的一个小灯就是一个像素点,也不是我们画点阵的时候说的一个点就是一个像素点,也不是我们喷墨打印机喷墨的时候一个墨点就是一个像素点,WPF中的一个像素,被固定为了 1/96 英寸。也就是说,当你在WPF中写一个按钮的宽度是96px,就是等于告诉WPF,我想要一个一英寸宽的按钮。

  2. 当我们在WPF中写 我想要96px宽度的按钮,在不同的显示器,不同的分辨率真的都能给我绘制出一英寸的按钮么?

    答案是:不一定!这个不一定,就是很多同学困惑的,那么微软是不是忽悠我们呢,这里渲染成多少到底跟多少因素有关系呢?我们首先解谜:跟你的显示器自身物理DPI有关系,也跟系统DPI设置有关系。

    物理DPI,就是显示器自身到底多少个点是一英寸,系统DPI就是系统认为多少个点是一英寸,我们很容易发现,如果物理DPI和系统DPI对不上,即使WPF知道我想要一英寸的按钮,它使用系统DPI一算,算应该是多少点,结果到了显示器渲染的时候,用这么多点渲染出来的也不是一英寸,这里就有一个信息的差异,WPF只能帮我们告诉系统我们真实想要多少长度,而真正显示长度的是显示器,必须消除显示器和系统之间的DPI差异,才能真正的做到分辨率无关。

通过上面两个问题我们总结出来:WPF实现分辨率无关的必要条件是:系统DPI与显示器物理DPI值相同

那么我们最后问一个很多人问过的问题,来看看我们是不是弄懂了:同一个显示器,不改变DPI设置,将屏幕分辨率从1024 * 768调整到800 * 600,使用WPF编写的程序的窗口大小不会变化。(X)完全错误,WPF能消除这样设置的差异吗?显然不能,窗口一定会变大,如果这个结果对你来说并不显然,那你可能需要重新回去看一下上面的一节了。

WPF高级教程(一)概述相关推荐

  1. (Java高级教程)第四章必备前端基础知识-第二节1:CSS概述和选择器

    文章目录 一:CSS概述 (1)概述 (2)语法规范 (3)CSS引入方式 二:选择器 (1)基础选择器 ①:标签选择器 ②:类选择器 ③:id选择器 ④:通配符选择器 总结 (2)复合选择器 ①:后 ...

  2. [转帖]tar高级教程:增量备份、定时备份、网络备份

    tar高级教程:增量备份.定时备份.网络备份 作者: lesca 分类: Tutorials, Ubuntu 发布时间: 2012-03-01 11:42 ė浏览 27,065 次 61条评论 一.概 ...

  3. SpringBoot的高级教程

    SpringBoot的高级教程 一.SpringBoot缓存 缓存的场景 临时性数据存储[校验码] 避免频繁因为相同的内容查询数据库[查询的信息] 1.JSR107缓存规范 用的比较少 Java Ca ...

  4. C语言高级教程-C语言数组(六):变长数组

    C语言高级教程-C语言数组(六):变长数组 一.本文的编译环境 二.一维数组在执行期间确定长度 三.二维数组在执行期间确定长度 四.一维变长数组实例 五.完整程序 5.1 Main.h 文件程序 5. ...

  5. C语言高级教程-C语言数组(三)

    C语言高级教程之数组教程 本文的编译环境 一.前文:C语言数组(一.二)的链接 1.1.C语言数组一文章链接 1.2.C语言数组二文章链接 二.数组的初始化 2.1.数组的初始化的几种方式 三.数组和 ...

  6. 触动触摸脚本开发高级教程

    教程视频: https://www.bilibili.com/video/BV1wZ4y1H7nM/ 脚本开发高级教程 说明:教程共一节概述,十节正课.开发技术讨论群:797201907 群文件有视频 ...

  7. SpringBoot高级教程

    SpringBoot的高级教程 一.SpringBoot缓存 缓存的场景 临时性数据存储[校验码] 避免频繁因为相同的内容查询数据库[查询的信息] 1.JSR107缓存规范 用的比较少 Java Ca ...

  8. Mysql高级教程思维导图

    Mysql高级教程思维导图 1.思维导图总览: 2.MySQL架构介绍: 2.1.MySQL简介 2.2.MySQL Linux版安装 2.3.MySQL配置文件 2.4.MySQL逻辑架构介绍 2. ...

  9. Python高级教程:玩转Linux操作系统

    Python高级教程:玩转Linux操作系统 操作系统发展史 只有硬件没有软件的计算机系统被称之为"裸机",我们很难用"裸机"来完成计算机日常的工作(如存储和运 ...

最新文章

  1. pytorch学习笔记(十二):详解 Module 类
  2. 深入理解javascript选择器API系列第二篇——getElementsByClassName
  3. RabbitMQ的消费限流
  4. Win2008 R2实战之只读域控制器部署(图)有修改
  5. 如何远程连接Windows和linux服务器
  6. Java性能调优调查结果(第三部分)
  7. 视频超分,Transformer再下一城之VSR-Transformer
  8. POJ2352 Stars
  9. 老男孩linux运维50期-谢江平
  10. 使用计算机打印资料时需要安装打印机驱动,打印机驱动安装步骤详解(一)_电脑基础知识_IT计算机_专业资料...
  11. 学会提问-批判性思维指南运用
  12. 第4讲 组合逻辑电路实例:编码器、译码器、数据选择器、加法器、数值比较器、代码转换器——计算机逻辑基础
  13. 在东钿第一次早会分享励志小故事。
  14. 流程审批: 有个人不走申请人直属领导审批,审批流程设定(设定条件,矩阵相关)
  15. 76、多边形一些基本操作(自相交、尖刺、保证逆时针、求交)
  16. 已知销售额怎么计算成本_知道销售总额怎么计算成本价?
  17. 用js进行日期的加减
  18. 一种具有椭圆型金属钛球体的C4炸弹
  19. 51单片机的应用——正脉冲宽度的的测量
  20. 考Java认证有用吗?

热门文章

  1. c/c++基本类型sizeof:short,unsigned short,int,unsigned int,long,unsigned long,long long,unsigned long lon
  2. 那个点燃了火堆,并且拥有200多个笔名的男人
  3. 关键词搜索API接口之1688平台
  4. Photoshop用光与影表现3D立体字效果
  5. android音频驱动目录,手机录音在哪个文件夹_安卓手机录音保存路径 - 驱动管家...
  6. Python之异常(try的用法)
  7. Shell十三问——ChinaUnix论坛精华整理
  8. html5火焰动画cavans
  9. 国内申请TwitterAPI过程分享
  10. js创建数组的简单方法