一、Window 图形演化

创建用户界面:

  • User32: 该部分为许多元素(如窗口、按钮和文本框等)提供了熟悉的 Windows 外观。
  • GDI/GDI+: 该部分为渲染简单形状、文本以及图像提供了绘图支持,但增加了复杂程度(而且通常性能较差)。

不同框架工具(如.NET、MFC)只是为与 User32 和 GDI/GDI+ 进行交互提供了不同的封装器而已,底层都是使用 Windows 操作系统的相同部分分来工作的。

DirectX:新的图形引擎

特点: 提供复杂的纹理映射、特殊效果(如半透明)以及三维图形所需的硬件加速功能。
DirectX 曾主要作为游戏开发人员的工具包,现 WPF 应用程序在底层都是使用DirectX。

二、WPF 体系结构

图1-2中包含的一些重要组件:

  • PresentationFramework.dll 包含 WPF 顶层的类型,包括那些表示窗口、面板以及其他类型控件的类型。它还实现了高层编程抽象,如样式。开发人员直接使用的大部分类都来自这个程序集。

  • PresentationCore.dll 包含了基础类型,如 UIElement 类和 Visual 类,所有形状类和控件类都继承自这两个类。如果不需要窗口和控件抽象层的全部特征,可使用这一层,而且仍能利用 WOF 的渲染引擎。

  • WindowBase.dll 包含了更多基本要素,这些要素具有在 WPF 之外重用的潜能,如DispatcherObject 类和 DependencyObject 类,这两个类引入了依赖项属性。

  • milcore.dll 是 WPF 渲染系统的核心,也是媒体集成层(MIL)的基础。其合成引擎将可视化元素转换为 Direct3D 所期望的三角形和纹理。尽管将milcore.dll 视为 WPF 的一部分,但它也是 Windows Vista 和 Windows 7 的核心系统组件之一。实际上,桌面窗口管理器(DWM)使用 milcore.dll 渲染桌面。

  • WindowCodecs.dll 是一套提供图像支持的低级 API(例如处理、显示以及缩放位图和 IPEG 图像)。

  • Direct3D 是一套低级 API, WPF 应用程序中的所有图形都由它进行渲染。

  • User32 用于决定哪些程序实际占有桌面的那一部分。所以它仍被包含在 WPF 中,但不再负责渲染通用控件。

三、类层次结构

1.System.Threading.DispatcherObject 类
单线程亲和模(Single-Thread Affinity,STA)模型,整个用户界面由单个线程拥有。从另一个线程与用户界面元素进行交互是不安全的。为方便使用此模型,每个 WPF 应用程序由协调消息(键盘输入、鼠标移动仍至框架处理,如布局)的调度程序管理。通过继承自 DispatcherObject 类,用户界面中的每个元素都可以检查代码是否在正确的线程上运行,并能通过访问调度程序为用户界面线程封送代码。

2.System.Windows.DependencyObject 类
在 WPF 中,主要通过属性与屏幕上的元素进行交互。在早期设计阶段,WPF 的设计者决定创建一个更加强大的属性模型。该模型支持许多特性,例如更改通知、默认值继承以及减少属性存储空间。最终结果就是依赖项属性特性。

3.System.Windows.Media.Visual 类
在 WPF 窗口中显示的每个元素本质上都是 Visual 对象。可将 Visual 类视为绘图对象,其中封装了绘图指令、如何执行绘图的附加细节(如剪裁、透明度以及变换设置)以及基本功能(如命中测试)。Visual 类还在托管的 WPF 库和渲染桌面的 milcore.dll 程序集之间提供链接。任何继承自 Viusal 的类都能在窗口上显示出来。如果更愿意使用轻量级的 API 创建用户界面,而不想使用 WPF 的高级框架特征。

4.System.Windows.UIElement类
UIElement 类增加了对 WPF 本质特征的支持,如布局、输入、焦点和事件。

5.System.Windows.FrameworkElement 类
FramworkElement 类是 WPF 核心继承树中的最后一站。该类实现了一些全部由 UIElement 类定义的成员。例如,UIElement 类为 WPF 布局系统设置了基础,但 FrameworkElement 类提供了支持它的重要属性(如 HorizontalAlignment 和 Margin 属性)。UIElement 类还添加了对数据绑定、动画以及样式等核心特性的支持。

6.System.Windows.Shapes.Shape 类
基本的形状类(如 Rectangle 类、Polygon 类、Ellipse 类、Line 类以及 Path 类)都继承自该类。可将这些形状类与更传统的 Windows 小组件(如按钮和文本框)结合使用。

7.System.Windows.COntorls.Control 类
控件(control)是可与用户进行交互的元素。控件显然包括 TextBox 类、Botton 类和 ListBox 类等。Control 类为设置字体以及前景色与背景色提供了附加属性。

8.System.Windows.Controls.ContentControl 类
ContenControl 类是所有具有单一内容的控件的基类,包括简单的标签乃至窗口的所有内容。该模型给人印象最深刻的部分是:控件中的单一内容可以是普通字符串乃至具有其他形状和控件组合的布局面板。

9.System.Windows.Controls.ItemsControl 类
ItemsControl 类是所有显示选项集合的控件的基类,如 ListBox 和 TreeView 控件。列表控件十分灵活。例如,使用 ItemsControl 类的内置特征,可将简单的 ListBox 控件变换成单选按钮列表、复选框控件列表、平铺的图像或是您所选择的完全不同的元素的组合。实际上。WPF 中的菜单、工具栏以及状态栏都是特定的列表,并且实现它们的类都继承自 ItemsControl 类。

10.System.Windows.Controls.Panel 类
Panel 类是所有布局容器的基类,布局容器是可包含一个或多个子元素、并按特定规则对子元素进行排列的元素。

(一)WPF - WPF相关推荐

  1. [WPF]WPF中材质制作——图片和矢量图之争

    如果要做下面这样的一个东西作为背景.你会如何做呢? 图1. 目标背景效果 方案一,用PS画出来.然后把这个PNG图片作为背景色.这个方案可以,但是如果想让这个线的颜色可配置呢?如何线的粗细不确定呢?无 ...

  2. [WPF]WPF开发方法论

    纵观Windows GUI应用程序开发方法,从Windows API.MFC到Visual Basic再到.NET Framework,WPF的开发方法论是在.NET Framework方法论的基础上 ...

  3. 学习WPF——WPF布局——了解布局容器

    WPF布局工作内部原理 WPF渲染布局时主要执行了两个工作:测量和排列 测量阶段,容器遍历所有子元素,并询问子元素所期望的尺寸 排列阶段,容器在合适的位置放置子元素,并设置元素的最终尺寸 这是一个递归 ...

  4. [WPF]WPF Data Virtualization和UI Virtualization

    这篇博客将介绍WPF中的虚拟化技术. 1. Data Virtualization 通常情况下我们说数据虚拟化是指数据源没有完全加载,仅加载当前需要显示的数据呈现给用户.这种场景会让我们想到数据分页显 ...

  5. [WPF] WPF浏览器程序:如何发布并解决不信任程序问题

    在发布WPF浏览器程序时,会遇到这么一个问题(如图示),该文就来解决这么一个问题,顺带把WPF浏览器程序的发布也简单的讲述一下. 新建WPF浏览器程序项目 打开项目属性→安全性,选择完全可信程序 打开 ...

  6. WPF: WPF 中的 Triggers 和 VisualStateManager

    在之前写的这篇文章 WPF: 只读依赖属性的介绍与实践 中,我们介绍了在 WPF 自定义控件中如何添加只读依赖属性,并且使其结合属性触发器 (Trigger) 来实现对控件样式的改变.事实上,关于触发 ...

  7. WPF WPF布局元素

    WPF中的布局元素: Grid:网格.类似HTML中的Table. StackPanel:栈式面板.竖直或水平排成一条直线. Canvas:画布.绝对坐标定位,类似于Windows Form的布局. ...

  8. [WPF] WPF做的漂亮的登陆界面[附源码]

    登陆界面上的logo都是从网上找的,请大家替换成自己公司的logo即可..... WPF界面库,非常漂亮的WPF界面[附源码] https://www.itsvse.com/thread-4941-1 ...

  9. WPF wpf scrollviewer 触屏滚动 窗体弹跳

    触屏滚动实现 设置属性  在ScrollViewer的xaml代码那里加上 PanningMode="Both" 在ScrollViewer的xaml代码那里加上 1 Manipu ...

最新文章

  1. 【Zabbix】邮件接收 Problem 通知
  2. pmp每日三题(2022年2月17日)
  3. 机器不学习:CNN 入门讲解1-什么是卷积
  4. 黑马程序员—————— 多线程
  5. Python的网络编程[1] - FTP 协议[1] - 使用 pyftplib 建立 FTP 服务器
  6. html5设置播放按钮,HTML5 Flowplayer的附加播放按钮
  7. python字典和集合对象可以进行索引操作_python字典和列表的高级应用
  8. 开源 TiDB Operator 让 TiDB 成为真正的 Cloud-Native 数据库
  9. js checkbox 选中判断
  10. MySql 双主多从配置指导
  11. Mybatis_select、insert、update、delete常用属性
  12. mcu AD采样值和物理值
  13. Android JNI:lame库的编译及使用
  14. 便携式三星mysql_三星折叠手机终于来了!9 月 18 日正式发售
  15. c语言日历显示系统,C语言实现显示日历
  16. 前端js中文转拼音(例:张三转为ZhangSan)
  17. 七牛服务器获取文件内容
  18. 消防应急照明和疏散指示系统在综合大楼(楼宇建筑)的研究与应用
  19. 路由器php系统时间设置时间设置时间设置,4G工业路由器系统设置与时间密码设置...
  20. VC|MFC内存不能为read,内存不能为 written 分析

热门文章

  1. Rect、RectF矩形类
  2. 2 计算机病毒表现现象,计算机病毒表现形式是什么
  3. exit(0)与exit(1)、exit(-1)、return区别
  4. 关于“前言中不允许有内容”的XML错误
  5. 全国首个人工智能课程走进中小学课堂
  6. 数据结构与算法基础ppt
  7. java utf 8转义_Tomcat8及以上特殊字符转义问题
  8. java 图书馆管理系统
  9. mysql创建函数的权限_MySQL创建用户和权限管理的方法
  10. 西电数字电路与逻辑设计手写笔记