Skip to content

Files

Latest commit

1987c0f · Jan 11, 2022

History

History
136 lines (95 loc) · 7.45 KB

01.md

File metadata and controls

136 lines (95 loc) · 7.45 KB

一、WPF 起源

要完全了解你在哪里,唯一的方法就是了解你去过哪里。WPF 彻底改变了我们开发桌面应用的方式。我不是简单地谈论编写应用程序,而是操作系统呈现应用程序图形用户界面的方式的核心变化。

User32 和 GDI/GDI+

GDI/GDI+为视窗操作系统提供了图像、形状和文本等绘图支持。众所周知,这些技术使用起来相对复杂,性能也很差。User32 子系统为窗口元素(如按钮、文本框、窗口等)提供了通用的外观和感觉。

在 WPF 之前出现的任何框架都只是为 GDI/GDI+和 User32 提供了优化的包装器。这些包装器提供了改进的 API,但是性能仍然很差,因为底层技术是相同的。

然后是 DirectX

微软创建 DirectX 是为了提供一个工具包,允许开发人员创建视频游戏,可以绕过 GDI/User32 子系统的限制。DirectX 应用编程接口极其复杂,因此不太适合创建业务线应用程序用户界面。

WPF 出手相救

WPF 是自 Windows 95 以来对 Windows 操作系统最全面的图形技术变革。WPF 在幕后使用 DirectX 渲染图形内容,让 WPF 能够利用硬件加速。这意味着在渲染 WPF 应用程序时,您的应用程序将尽可能多地使用 GPU(显卡的处理器)。

有限容量的用户 32

WPF 在有限的能力范围内使用用户 32 来处理你的输入控件(例如你的鼠标和键盘)的路由。然而,所有的绘图功能都通过 DirectX 进行了传递,从而极大地提高了性能。

WPF 和 Windows 7/Windows Vista

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;
                }
            }
        }
    }

| | 提示:您可以使用渲染层来调整用户界面。这样,您可以将动画和其他图形处理器密集型操作限制在支持它们的显卡上。 |

| | 注意:后面的代码看起来类似于 WinForms 表单后面的代码。 |