要完全了解你在哪里,唯一的方法就是了解你去过哪里。WPF 彻底改变了我们开发桌面应用的方式。我不是简单地谈论编写应用程序,而是操作系统呈现应用程序图形用户界面的方式的核心变化。
GDI/GDI+为视窗操作系统提供了图像、形状和文本等绘图支持。众所周知,这些技术使用起来相对复杂,性能也很差。User32 子系统为窗口元素(如按钮、文本框、窗口等)提供了通用的外观和感觉。
在 WPF 之前出现的任何框架都只是为 GDI/GDI+和 User32 提供了优化的包装器。这些包装器提供了改进的 API,但是性能仍然很差,因为底层技术是相同的。
微软创建 DirectX 是为了提供一个工具包,允许开发人员创建视频游戏,可以绕过 GDI/User32 子系统的限制。DirectX 应用编程接口极其复杂,因此不太适合创建业务线应用程序用户界面。
WPF 是自 Windows 95 以来对 Windows 操作系统最全面的图形技术变革。WPF 在幕后使用 DirectX 渲染图形内容,让 WPF 能够利用硬件加速。这意味着在渲染 WPF 应用程序时,您的应用程序将尽可能多地使用 GPU(显卡的处理器)。
WPF 在有限的能力范围内使用用户 32 来处理你的输入控件(例如你的鼠标和键盘)的路由。然而,所有的绘图功能都通过 DirectX 进行了传递,从而极大地提高了性能。
WPF 将在 Windows 7 或 Windows Vista 下表现最佳。这是因为这些操作系统允许该技术利用视窗显示驱动程序模型(WDDM)。WDDM 允许同时调度多个 GPU 操作。它还提供了一种机制,当超过显卡内存阈值时,可以使用正常系统内存对显卡内存进行分页。
WPF 基础设施的首要任务之一是评估您的显卡,并提供一个称为等级值的分数或评级。WPF 认可三种不同的等级价值观。等级值描述如下,由 WPF 的微软开发者网络文档提供,可在https://msdn . Microsoft . com/en-us/library/ms 742196(v = vs . 100)获得。aspx :
渲染层 0 :无图形硬件加速。所有图形功能都使用软件加速。DirectX 版本级别低于 9.0 版本。
渲染层 1 :部分图形功能使用图形硬件加速。DirectX 版本级别高于或等于 9.0 版本。
渲染层 2 :大部分图形功能使用图形硬件加速。DirectX 版本级别高于或等于 9.0 版本。
要以编程方式检索渲染层,您需要使用静态系统。windows . media . render capability . tier属性。您必须将属性移动 16 位才能访问层值。这些额外的位考虑到了可扩展性,例如将来存储关于对其他特性或层的支持的信息的可能性。为了说明,我们将创建一个 WPF 应用程序。我将说明如何一步一步地创建一个 WPF 项目,因为这将是贯穿整本书的每个例子的起点。请注意:我使用的是 Visual Studio 2010 专业版;但是,无论版本如何,步骤都应该相同。
打开 Visual Studio,选择新建项目。
图 1:新项目窗口
WPF 应用程序包含一个窗口和一个代码。文件包含 xaml 标记。文件包含代码隐藏逻辑。如果您有创建 Windows 窗体应用程序的经验,您应该对后面的代码很熟悉。XAML 标记一开始可能看起来很混乱,但是不要担心,我们将在后面的章节中介绍标记。
下面是设计模式下 MainWindow.xaml 文件的截图:
图 2:设计模式下的主窗口. xaml 文件
| | 提示:在设计模式下,您可以拆分设计器,在顶部查看呈现的输出,在底部查看 XAML 标记。 |
在解决方案资源管理器的右侧,您会发现主窗口. xaml 和主窗口. xaml.cs 代码隐藏文件。首先,我们从 XAML 开始。
<Window x:Class="Chapter01.MainWindow"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="134" Width="515">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="36*" />
<RowDefinition Height="91*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Content="Rendering Tier" />
<TextBox Grid.Row="0" Grid.Column="1" x:Name="txtRenderingTier" />
<Button x:Name="btnGetRenderingTier" Content="Get Rendering Tier" Grid.Row="1" Grid.Column="1" Width="130" Height="30" Click="btnGetRenderingTier_Click" />
</Grid>
</Window>
| | 注意:WPF 窗口可以与 WinForms 窗体对象进行比较。 |
这是定义用户界面的 XAML(可扩展应用标记语言)。XAML 是一种基于 XML 的标记语言,在第 2 章中有详细介绍。基本上,我们有一个标签控件、一个文本框控件和一个按钮。网格控件用于控制其他控件的布局。我们在这个例子中使用的主要显示单元是 WPF 窗。
下面是后面 MainWindow.xaml.cs 代码的内容:
using System.Windows;
using System.Windows.Media;
namespace Chapter01
{
/// <summary>
/// Interaction logic for MainWindow.xaml.
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnGetRenderingTier_Click(object sender, RoutedEventArgs e)
{
//Shift the value 16 bits to retrieve the rendering tier.
int currentRenderingTier = (RenderCapability.Tier >> 16);
switch (currentRenderingTier)
{
//DirectX version level less than 7.0.
case 0:
txtRenderingTier.Text =
string.Format("{0} No hardware acceleration.",
currentRenderingTier.ToString());
break;
//DirectX version level greater than 7.0 but less than 9.0.
case 1:
txtRenderingTier.Text =
string.Format("{0} Partial hardware acceleration.",
currentRenderingTier.ToString());
break;
//DirectX version level greater than or equal to 9.0.
case 2:
txtRenderingTier.Text =
string.Format("{0} Total hardware acceleration.",
currentRenderingTier.ToString());
break;
}
}
}
}