WPF概述

  WPF(Windows Presentation Foundation)是用于 Windows 的现代图形显示系统。与之前出现的其他技术相比,WPF发生了根本性变化,引入了“内置硬件加速”和“分辨率无关”等创新功能;本章将介绍这两项功能。

WPF应用特点

  • 硬件加速 。通过DirectX执行所有WPF绘图操作,以便充分利用现代显卡的最新功能
  • 分辨率无关。WPF能够根据系统DPI设置,很长灵活地方大和缩小显示的内容,以使其适合所用的显示器和显示选择
  • 控件无固定外观。可自由定制外观
  • 声明式用户界面。通过XAML不必编写代码即可创建窗口
  • 基于对象的绘图。即使准备在更低级的可视化层(而非高级元素层)上工作,也不需要使用绘图和像素进行工作,而是创建图形对象并让 WPF 尽可能最优化地显示出来。

WPF体系结构

  WPF 使用多层体系结构。在顶层,应用程序与完全由托管C#代码编写的一组高层服务进行交瓦。至于将.NET 对象转换为Direct3D纹理和三角形的实际工作,是在后台由一个名为milcore.dll 的低级非托管组件完成的。milcore.dll 是使用非托管代码实现的,因为它需要和Direct3D紧密集成,并且它对性能极其敏感。

体系结构

WPF 应用程序中各层的工作情况

WPF体系结构

  • PresentationFramework.dll 包含 WPF 顶层的类型,包括那些表示窗口、面板以及其他类型控件的类型。它还实现了高层编程抽象,如样式。开发人员直接使用的大部分类都来自这个程序集。
  • PresentationCore.dll 包含了基础类型,如 UIElement 类和 Visual类,所有形状类和控件类都继承自这两个类。如果不需要窗口和控件抽象层的全部特征,可使用这一层,而且仍能利用 WPF 的渲染引擎。
  • WindowsBase.dll 包含了更多基本要素,这些要素具有在WPF之外重用的潜能,如DispatcherObiect 类和 DependencyObiect类,这两个类引入了依赖项属性。
  • milcore.dll 是 WPF 渲染系统的核心,也是媒体集成层(MediaIntegration Layer,MIL)的基础。其合成引擎将可视化元素转换为Direct3D所期望的三角形和纹理。尽管将milcore.dll 视为 WPF 的一部分,但它也是 Windows Vista和 Windows7的核心系统组件之一。实际上,桌面窗口管理器(Desktop Window Manager,DWM)使用 milcore.dll渲染桌面。
  • WindowsCodecs.dll 是一套提供图像支持的低级 API(例如处理、显示以及缩放位图和JPEG 图像)。
  • Direct3D 是一套低级 API,WPF 应用程序中的所有图形都由它进行渲染。
  • User32 用于决定哪些程序实际占有桌面的哪一部分。所以它仍被包含在 WPF 中,但不再负责渲染通用控件。

类层次关系

类层次关系

类层次关系

DispatcherObject

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

DependencyObject

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

Visual

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

UIElement

  UIElement 类增加了对 WPF 本质特征的支持,如布局、输入、焦点和事件(WPF 团队使用首字母缩写词 LIFE 来表示)。WPF实现了增强的称为路由事件(RoutedEvent)的事件路由系统,UIElement类中还添加了对命令的支持。

FrameworkElement

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

Shape

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

Control

  控件(control)是可与用户进行交互的元素。控件显然包括TextBox 类、Button 类和 ListBox类等。Control类为设置字体以及前景色与背景色提供了附加属性。但最令人感兴趣的细节是模板支持,通过模板支持,可使用自定义风格的绘图替换控件的标准外观。

ContentControl

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

ItemControl

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

Panel

  Panel 类是所有布局容器的基类,布局容器是可包含一个或多个子元素、并按特定规则对子元素进行排列的元素。这些容器是WPF布局系统的基础,要以最富有吸引力、最灵活的方式安排内容,使用这些容器是关键所在。