Windows Presentation Foundation (WPF) API 从根本上不同于图形设备接口 (GDI)和GDI+ API,要求以不同的方式处理编程的许多方面。本主题简要概述了两个主要领域的主要差异,包括作为渲染器和作为框架的差异。
渲染器作为渲染器,WPF 使您能够使用:
- 动画 - WPF 对计时和屏幕重绘的内置支持
- 渐变- 沿轴混合颜色以添加高光、阴影和 3D 效果
- 抗锯齿 - 通过抗锯齿减少对角线和曲线的锯齿
- UI 缩放 - 缩放整个用户界面而不是单个图形
- 半透明 - 通过采用半透明增加可用屏幕区域
- 矢量图形 - WPF 具有对矢量图形的内置支持,实际上提供了无限缩放而不会损失质量
- 音频和视频 - WPF 具有用于多媒体播放的内置渲染器
- 设备独立性 - 使用设备独立单位意味着 WPF 应用程序将自动缩放到设备正在使用的 dpi
下表总结了基于 GDI 和基于 WPF 的渲染之间的这些差异:
特征GDI/GDI+(Windows 窗体)WPF使用的 DLLSystem.dll System.Drawing.dll System.Windows.Forms.dllWindowsBase.dll PresentationCore.dll PresentationFoundation.dll视窗许多窗户一窗单位设备相关单位(像素)独立于设备的单元(1/96 英寸)控制定位绝对绝对、动态、数据绑定图像由紧密间隔的点行(位图,基于光栅)数学方程(基于向量)渲染引擎直接渲染DirectX (Direct3D) 媒体模式立即 - 应用程序重新绘制变得无效的区域保留 - 应用程序保留绘图信息,系统进行重新绘制绘画剪裁 - 确定边界并在那里进行绘画从后到前执行的渲染 - 组件相互绘制笔和刷子当前笔和当前画笔每次绘图调用都提供适当的笔或刷子绘画区域最小化要绘制的区域不需要最小化活动活动路由事件视频和音频需要像 Windows Media Player 这样的播放器内置支持 视窗使用 GDI/GDI+ API 构建的应用程序使用许多窗口,并且驻留在父窗口 (MDI) 下。WPF 中构建的应用程序只有一个窗口。
测量单位使用 GDI/GDI+ API 的应用程序使用与设备相关的单位(像素)作为度量单位。在这些应用中,随着显示设备的分辨率增加,产生的逻辑图像尺寸减小。为 WPF 构建的应用程序使用与设备无关的单位(1/96 英寸)作为度量单位。当设备的 DPI 为 96 时,两幅图像是等价的。
控制定位使用 GDI+ 构建的应用程序使用绝对定位。当父元素调整大小时,子元素不会自动调整大小。为 WPF 构建的应用程序可以使用绝对定位、动态定位或数据绑定定位。无论是绝对定位还是动态定位,控件都相对于父元素定位。
图像基础在 GDI/GDI+ 中创建的图像是基于像素的光栅图像。在 WPF 中创建的那些可以是可缩放的矢量图像。
渲染引擎GDI 和 GDI+ 都是基于 Win32 构建的。GDI 基于设备上下文 (DC) 的概念,其中应用程序获取设备上下文的句柄,并使用这些句柄与设备进行交互。GDI+ 是围绕 GDI 的包装器,用于创建 C++Graphics
对象。另一方面,WPF 建立在 DirectX 之上,这意味着它可以在执行绘图操作时利用硬件加速。
使用 GDI 和 GDI+,呈现使用立即呈现:应用程序重新绘制变得无效的区域。在 WPF 中,渲染使用保留渲染:应用程序跟踪绘制信息,但系统执行绘制。
绘画使用 GDI 和 GDI+,剪裁用于确定已失效并需要绘制的区域的边界。在 WPF 中,绘制是从后向前执行的,并且组件相互绘制。
钢笔和画笔GDI 和 GDI+ 使用当前画笔和当前笔的概念。在 WPF 中,每次绘图调用都必须传递画笔和钢笔。
绘制区域优化绘制区域优化是使用 GDI 或 GDI+ 绘制的重要部分。在 WPF 中,不考虑它。
活动GDI 和 GDI+ 使用事件和使用订阅/通知的事件处理程序委托。相比之下,WPF 使用冒泡、隧道和直接事件通知,并且事件在VisualTree
.
GDI 或 GDI+ 不提供对视频和音频的直接支持,但必须通过媒体播放器(如 Windows Media Player)获得。WPF 通过MediaElement Class直接支持视频和音频。
框架作为一个框架,WPF 使您能够使用:
- XAML - 无需在 Visio 或 PowerPoint 中创建模型。使用 XAML 可以直接为应用程序创建用户界面,以便使用业务逻辑对其进行编码。
- 样式和模板 - 在任何 UI 元素上使用样式以保持视觉一致性。
- 数据绑定 - 绑定元素,以便它们可以呈现数据或与数据交互。
- 本地化应用程序的工具 - 尽管使用 Windows 窗体可以使用 Winres.exe 或 Visual Studio 来本地化窗体,但在 WPF 中可以使用LocBaml工具。