这篇文中通过常见的问题开始 WPF 之旅。我们从理解为什么使用 WPF 开始?为了更好的理解 WPF ,我们将使用 WPF 创建一个简单的“ Hello World ”项目。
首先,我们了解一下微软显示技术的发展。
User32 : 它提供了窗体和按钮、文本框和其他 UI 元素的外观。 User32 缺乏绘制能力。
GDI ( Graphics Device Interface ): Microsoft 引入了 GDI 绘图功能。 GDI 不仅提供了绘图功能,而且在硬件显示上提供高水平抽象。换句话说,它封装了所有硬件复杂性到 GDI 的 API 。
GDI+ : GDI+ 被认为是 GDI 的扩展,提供了扩展功能像支持 JPG 和 PNG ,渐变阴影和图像保真。 GDI 的 API 最大的问题是它没有使用硬件加速,不支持动画和 3D 。
注意: 硬件加速过程中,我们使用硬件执行一些功能,而不是使用 CPU 上运行的软件来执行这些功能。
DirectX : GDI 和它的扩展 GDI+ 最大的问题是硬件加速和动画支持。这对于游戏开发者来说是最大的缺点。为了回应游戏服务开发者微软开发的 DirectX 。 DirectX 利用硬件加速支持 3D ,全彩图像,流媒体设备等。当它进入游戏产业时这个 API 还不成熟。
WPF : 微软已经有 3 、 4 个显示技术的 API ,那为什么好需要多一个显示技术呢。 DirectX 显著特点是使用硬件加速。微软希望能利用硬件加速技术开发像文本框、按钮、表格等 UI 元素。 WPF 标准是在 DirectX 之上的,你不仅可以使用它创建简单的 UI 元素也可以进一步开发特殊像 Grid 、 FlowDocument 、 Ellipse 等 UI 元素。你也可以进一步创建动画。 WPF 并不是为了游戏开发。 DirectX 仍然将引领游戏开发。如果你在寻找动画开发的道路(而不是游戏编程) WPF 将是一个选择。你可以使用 XML 表示 WPF ,也被称为 XAML 。换句话说 WPF 是建立在 DirectX 上的包装。因此,让我们来定义 WPF 。
WPF 是一个简化建立动态用户界面类的集合。这些类包括一系列新的空间,一些模拟旧的 UI 元素(例如, Label 、 TextBox 、 Button ),和一些新 UI 元素(例如, Grid 、 FlowDocument 和 Ellipse )。
硬件加速过程是使用硬件执行一些功能,而不是使用运行在 CPU 上的软件来执行这些功能。
WPF 利用硬件加速有两层方式。
WPF API 首先使用量视频卡的内存,像素值等参数检测硬件加速的级别。根据渲染模式分为 0 级、 1 级和 2 级。
Tier 0: - 如果视频卡不支持硬件加速, WPF 使用 0 级渲染模式。换句话说,使用软件加速。相当于 DirectX 7.0 以前版本。
Tier 1: - 如果视频卡支持部分硬件加速, WPF 使用 1 级渲染模式。 相当于 DirectX7.0 和 9.0 之间的版本。
Tier 2: - 如果视频卡支持硬件加速, WPF 使用 2 级渲染模式模式。 相当于 DirectX9.0 及更高版本。
不, WPF 没有替代 DirectX 。做尖端游戏仍然需要 DirectX 。 DirectX 执行视频性能比 WPF API 高很多倍。因此,当涉及到游戏开发时总是使用 DirectX 而不是 WPF 。开发游戏 WPF 不是最佳的解决方法,但可以开发一些像 TIC TAC TOE 等动画效果不高的游戏。
有一点需要记住 WPF 是代替 Windows 形式而不是 DirectX 。
Windows Presentation Framework 是新的显示 API 。 WPF 是二维和三维图形引擎。它具有以下功能:
l 具有所有像按钮、复选框等普通用户控件。
l 固定和流动的文档格式。
l 具有 HTML 和 Flash 的所有功能。
l 支持 2D 和 3D 矢量图。
l 动画功能。
l 多媒体功能。
l 数据绑定。
上述图形显示 WPF 整体架构。它有三个核心部分 Presentation 核心, Presentation 框架和 milcore 。在同一图中显示了其他部分如何直接和操作系统交互。所有,一段一段的去了解每段的工作。
User32: - 决定显示在屏幕上的位置。
DirectX: - 正如前面所说的 WPF 使用内部 DirectX 。 DirectX 与驱动交互。
Milcore: - Mil 表示媒体集成库。这部分是非托管代码因为它充当着托管 WPF 和非托管 DirectX / User32 API 之间的桥梁。
Presentation core :- 这部分是暴露给 WPF 低层次的 API 提供了 2D 、 3D 和几何等特性。
Presentation framework:- 这部分是想应用控件、布局等高层次特性。这些内容帮助建立应用程序。
这里显示了 WPF 中有十个重要的命名空间 / 类。
System.Threading.DispatcherObject
所有 WPF 对象都是从 DispatcherObject 继承而来。 WPF 工作在 STA 模式上即单线程单元模式。这个对象主要任务是处理并发和线程。任何像鼠标点击、按钮点击等消息初始化后被发送到 DispatcherObject 确认代码是否允许在当前线程。接下来的部分将研究 WPF 线程工作的细节。
System.Windows.DependencyObject
WPF 认为是基于框架的属性设计。换言之,使用使用属性而不是对象的方法、事件等行为进行交互。现在我们仅限于这个定义。
System.Windows.Media.Visual
Visual 类是绘图对象,是画图指令和画像裁剪、图像透明度等其他功能的抽象类。 Visual 类充当非托管 MilCore.dll 和土管 WFP 类的桥梁。任何从 Visual 继承的类都能在窗体上显示。如果创建自定义界面可以在程序中使用那个 Visual 对象。
System.Windows.UIElement
UIElement 执行三个重要方面 – 布局、输入和事件。
System.Windows.FrameworkElement
FrameWorkElement 以 UIElement 为基础。它添加了 HorizontalAlignment 、 VerticalAlignment 、 margins 等关键属性。
System.Windows.Shapes.Shape
这个类帮我们创建像矩形、多边形、椭圆形、线和路径等基本图形。
System.Windows.Controls.Control
这个类有像 TextBox 、 Button 、 ListBox 等控件。它添加了一些像字体、前景色和背景色等属性。
System.Windows.Controls.ContentControl
它拥有单一的内容。它可以包括从简单的标签到使用形状的布局面板级。
System.Windows.Controls.ItemsControl
是所有显示项集合的类的基类,例如 ListBox 和 TreeView 。
System.Windows.Controls.Panel
这个类用于所有布局容器元素包含一个或多个子元素并按一定的布局规则安排他们。这些容器是 WPF 布局系统的基础,使用它们能更有吸引力、灵活的布局内容。
XAML (发音 Zammel )是一种基于 XML 的语言,可以在 XML 中都有对象和属性。 XAML 文档是由 XAML 分析器加载的。 XAML 解析器实例化对象并设置他们的属性。 XAML 描述对象、属性以及他们之间的关系。使用 XAML 可以创建任何对象包括图形对象和非图形对象。 WPF 解析 XAML 文档,根据 XAML 的定义实例化对象并创建 XAML 中定义的关系。
因此, XAML 是一个 XML 文档用于定义对象和属性并有 WPF 在实际内存中加载这些文档。
不, XAML 不只是供 WPF 使用。 XAML 是基于 XML 的语言,是 XML 的变体。
WPF 的 XAML 是用于描述 WPF 内容,例如 WPF 对象、控件和文档。在 WPF 中的 XAML 也有定义一个 XML 表示的电子文档的 XPS 的 XAML 。
Silverlight 应用程序使用的 Silverlight 的 XAML 是 WPF 的 XAML 的一个子集。 Silverlight 是跨平台浏览器插件帮助创建富客户端内容包括 2D 图形、动画、音频和视频。
WWF 的 XAML 并于描述 Windows Workflow Foundation 的内容。 WWF 引擎使用这种 XAML 调用相应的工作流。
为了理解 WPF 中的不同元素,我们将做一个小的 “ hello world ”示例,在这个过程中将理解 WPF 中不同的元素。
注意:这个示例我们使用 VS 2008 Express Edition 。
因此,打开 VS 2008 Express 并从模板中选择 WPf 应用程序如下图所示。
一旦我们创建了 WPF 应用程序项目,你可以看到两个文件类型,一个是 XAML 文件,一个是后置代码即 .XAML 和 .cs 。 XAML 并没有其他是 XML 文件包含显示在 Windows UI 上的所有所需的元素。每个 XAML 元素对应于类。例如,在 XAML 文件中的“ Window ”元素对应于“ WpfApplication.Window1 ”类,在 XAML 文件中的“ Button ”元素对应于“ System.Windows.Control.Button ”类,在 XAML 文件中的“ Grid ” XAML 元素对应于“ System.Windows.Control.Grid ”类。
“ App.XAML ”和“ App.XAML.CS ”是入口文件。如果看到“ App.XAML.CS ”代码,将看到一个需要加载的 XAML 的引用。因为,在应用程序中首先运行的是“ App.XAML.CS ”中的代码“ void Main() ”方法,加载“ Window1.XAML ”文件。
现在我们连接到 XAML 文件元素的后置代码中事件中的方法。
可以从上面的代码段中看出,按钮元素点击事件是如何连接到“ MyButton_Click ”方法。“ MyButton_Click ”是定义在后置代码 XAML.CS 中的方法。
如果运行这段代码可以看到一个按钮,如果点击它可以看到一个消息框,如下图所示。
依赖属性属于一个类但可以被另一个类使用。
看下面代码:
高和宽是矩形常规的属性。但 Canvas.Top 和 Canvas.Left 是依赖属性,是属于 Canvas 类的。用在矩形中指定进行在 Canvas 中的位置。
XAML 文件通常是编译而不是运行时解析。当运行基于 XAML 的项目时,可以看到它在 obj/Debug 文件夹中创建一个 g.cs 扩展文件。因此,对美国 XAML 文件都将找到一个 g.cs 文件。例如, Shiv.XAML 在 obj/Debug 文件夹中有一个 Shiv.g.cs 文件。总而言之,在运行时,实际上是看不到 XAML 文件的。如果想在运行时,解析 XAML 文件也是允许的。
从代码中将 XAML 分离出来执行是 WPF 中一个重要特征。因此,设计人员能够独立设计应用程序的节目,开发人员可以编写实现功能的逻辑代码。
XAML 和后置代码
上面代码显示 XAML 文件和代码从 XAML 示例中分离。为了关联 XAML 文件的类需要指定 x:Class 属性。在 XAML 对象中任何事件可以通过定义具有发送者和事件值的方法来关联。可以从上面代码段看到连接 MyClickEvent 到后置代码中的一个事件。
在后置代码中访问 XAML 对象需要定义它们和 XAML 文档中名字相同。例如下面代码段定义了一个名为 objtext 对象并且在后置代码中也定义相同的名字。
访问 XAML 对象
支持 WPF 有两类主要的格式,固定格式文档和流格式文档。固定格式文档看起来像 PDF 格式。它们显示内容不管屏幕大小和分辨率。但流格式文档根据屏幕大小和分辨率进行调整。
下面是固定格式的代码段。可以看到文档外观像 PDF 阅读器。第一步定义文档标签,第二部显示文档外观。
文档浏览器