65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 和 Silverlight 的重要 FAQ 问题

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (86投票s)

2009年3月24日

CPOL

18分钟阅读

viewsIcon

191189

downloadIcon

2022

WPF 和 Silverlight 的 21 个重要 FAQ 问题

使用 Silverlight 进行单向、双向和一次性绑定的视频演示

引言

引言

本文从 WPF 和 Silverlight 的角度讨论了 21 个重要的 FAQ。这两种技术在一定程度上是相互关联的。本文不仅解释了这些技术的理论方面,还为每个技术展示了小示例。

这里有一本完整的免费电子书,涵盖了 C#、SQL Server、WPF、WWF、WCF 等 400 个 FAQ。欢迎下载并享用!

既然有 GDI、GDI+ 和 DirectX,为什么还需要 WPF?

首先,让我们尝试理解微软的显示技术是如何演进的。

注意:硬件加速是指利用硬件执行某些功能,而不是通过 CPU 上运行的软件来执行这些功能。

WPF 是一个类集合,它简化了动态用户界面的构建。这些类包括一组新的控件,其中一些模仿了旧的用户界面元素(例如 `Label`、`TextBox`、`Button`),而另一些则是新的(例如 `Grid`、`FlowDocument` 和 `Ellipse`)。

  • User32:它为按钮、文本框和其他 UI 元素提供了 Windows 外观和感觉。User32 缺乏绘图功能。
  • GDI (Graphics Device Interface):微软引入 GDI 以提供绘图功能。GDI 不仅提供绘图功能,还提供了对硬件显示的高级抽象。换句话说,它将所有硬件复杂性封装在 GDI API 中。
  • GDI+:引入了 GDI+,它基本上扩展了 GDI 并提供了额外的功能,如 JPG 和 PNG 支持、渐变填充和抗锯齿。GDI API 的最大问题是它不使用硬件加速,并且没有动画和 3D 支持。
  • DirectX:GDI 及其扩展 GDI+ 的最大问题是硬件加速和动画支持。这对于游戏开发者来说是一个巨大的劣势。为了响应和满足游戏开发者的需求,微软开发了 DirectX。DirectX 利用硬件加速,支持 3D、全彩图形、媒体流功能等等。这个 API 在游戏行业并没有成熟。
  • WPF:微软有 3 到 4 个不同的显示技术 API,为什么还要再加一个?DirectX 具有利用硬件加速的出色功能。微软希望使用 DirectX 技术开发文本框、按钮、网格等 UI 元素,以便他们可以利用硬件加速功能。由于 WPF 构建在 DirectX 之上,您不仅可以构建简单的 UI 元素,还可以更进一步开发 `Grid`、`FlowDocument` 和 `Ellipse` 等特殊 UI 元素。哦,对了,您还可以进一步创建动画。WPF 不是为游戏开发的。在这种情况下,DirectX 仍然是领先的。如果您正在寻找轻量级动画(非游戏编程),WPF 将是一个不错的选择。您还可以使用 XML 来表示 WPF,这也称为 XAML。换句话说,WPF 是一个构建在 DirectX 之上的包装器。现在让我们来定义 WPF。

WPF 的硬件加速是如何工作的?

硬件加速是指利用硬件执行某些功能,而不是通过 CPU 上运行的软件来执行这些功能。

WPF 以双层方式利用硬件加速。

WPF API 首先使用显卡 RAM、每像素值等参数检测硬件加速级别。根据这些,它使用 Tier 0、Tier 1 或 Tier 2 渲染模式。

  • Tier 0:如果显卡不支持硬件加速,则 WPF 使用 Tier 0 渲染模式。换句话说,它使用软件加速。这对应于 DirectX 版本小于 7.0 的工作方式。
  • Tier 1:如果显卡支持部分硬件加速,则 WPF 使用 Tier 1 渲染模式。这对应于 DirectX 版本在 7.0 到 9.0 之间的工作方式。
  • Tier 2:如果显卡支持硬件加速,则 WPF 使用 Tier 2 渲染模式。这对应于 DirectX 版本等于或大于 9.0 的工作方式。

这是否意味着 WPF 已经取代了 DirectX?

不,WPF 并未取代 DirectX。DirectX 仍然需要用于制作尖端游戏。DirectX 的视频性能仍然比 WPF API 高很多倍。因此,在游戏开发方面,首选始终是 DirectX 而不是 WPF。WPF 并不是制作游戏的最佳解决方案。哦,对了,您可以用它制作一个井字游戏,但不能制作高动作动画游戏。

请记住一点:WPF 是 Windows Forms 的替代品,而不是 DirectX 的替代品。

能否精确地定义 WPF?

Windows Presentation Foundation 是新的表示 API。WPF 是一个二维和三维图形引擎。它具有以下功能:

  • 包含所有等效的常用用户控件,如按钮、复选框、滑块等。
  • 固定格式和流格式文档。
  • 具有 HTML 和 Flash 的所有功能。
  • 2D 和 3D 矢量图形。
  • 动画
  • 多媒体
  • 数据绑定

什么是 XAML?

XAML(发音为 Zammel)是一种声明性的基于 XML 的语言,您可以通过它在 XML 中定义对象和属性。XAML 文档由 XAML 解析器加载。XAML 解析器实例化对象并设置它们的属性。XAML 描述对象、属性以及它们之间的关系。使用 XAML,您可以创建任何类型的对象,无论是图形还是非图形。WPF 解析 XAML 文档,实例化对象,并创建 XAML 定义的关系。因此,XAML 是一个定义对象和属性的 XML 文档,WPF 将此文档加载到实际内存中。

XAML 仅用于 WPF 吗?

不,XAML 并不仅仅用于 WPF。XAML 是一种基于 XML 的语言,它有几种变体。

  • WPF XAML 用于描述 WPF 内容,例如 WPF 对象、控件和文档。在 WPF XAML 中,我们还有 XPS XAML,它定义了电子文档的 XML 表示。
  • Silverlight XAML 是 WPF XAML 的一个子集,用于 Silverlight 应用程序。Silverlight 是一个跨平台浏览器插件,可帮助我们创建具有二维图形、动画以及音频和视频的丰富 Web 内容。
  • WWF XAML 有助于描述 Windows Workflow Foundation 内容。WWF 引擎然后使用此 XAML 并相应地调用工作流。

能否解释一下 WPF 的整体架构?

上图显示了 WPF 的整体架构。它有三个主要部分:表示核心 (presentation core)、表示框架 (presentation framework) 和 Milcore。在同一张图中,我们可以看到其他部分(如 DirectX 和操作系统)如何与系统交互。所以让我们逐节来理解一切是如何工作的。

  • User32:它决定屏幕上什么内容显示在哪里。
  • DirectX:如前所述,WPF 在内部使用 DirectX。DirectX 与驱动程序通信并渲染内容。
  • Milcore:Mil 是 Media Integration Library 的缩写。这一部分是托管代码,因为它充当 WPF 托管 API 与 DirectX / User32 非托管 API 之间的桥梁。
  • 表示核心 (Presentation Core):这是一个 WPF 公开的低级 API,提供 2D、3D、几何等功能。
  • 表示框架 (Presentation Framework):这一部分具有应用程序控件、布局、内容等高级功能,可帮助您构建应用程序。

WPF 中有哪些不同的命名空间和类?

WPF 中有十个重要的命名空间/类。

System.Threading.DispatcherObject

所有 WPF 对象都派生自 `DispatcherObject`。WPF 基于 STA 模型,即单线程单元模型。此对象的主要职责是处理并发和线程。当鼠标单击、按钮单击等消息触发时,它们会被发送到 `DispatcherObject`,该对象会验证代码是否在正确的线程上运行。在接下来的部分中,我们将详细介绍 WPF 线程的工作原理。

System.Windows.DependencyObject

在设计 WPF 时,考虑了基于属性的架构。换句话说,对象行为通过属性进行交互,而不是使用方法、函数和事件。目前,我们仅限于此定义。在接下来的部分中,我们将为此类问题专门进行讨论。

System.Windows.Media.Visual

`Visual` 类是一个绘图对象,它抽象了绘图指令、如何进行绘图(如剪辑、不透明度和其他功能)。`Visual` 类还充当非托管的 `MilCore.dll` 和 WPF 托管类之间的桥梁。当一个类派生自 `Visual` 时,它就可以在 Windows 上显示。如果您想创建自己的自定义用户界面,那么您可以使用 `Visual` 对象进行编程。

System.Windows.UIElement

`UIElement` 处理三个重要方面:布局、输入和事件。

System.Windows.FrameworkElement

`FrameWorkElement` 使用 `UIElement` 设定的基础。它添加了 `HorizontalAlignment`、`VerticalAlignment`、边距等关键属性。

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 布局系统的基础,使用它们是按照最吸引人和最灵活的方式排列内容的关���。

WPF 应用程序中涉及的不同元素

为了理解 WPF 的不同元素,我们将做一个简单的“hello world”示例,并在过程中理解 WPF 的不同元素。

注意:对于此示例,我们使用 VS 2008 免费版。

启动 VS 2008 免费版,然后从模板中选择 WPF 应用程序,如下图所示。

创建 WPF 应用程序项目后,您会看到两种文件类型:XAML 文件和后台代码,即 `XAML.cs`。XAML 文件本质上是 XML 文件,其中包含显示窗口 UI 所需的所有元素。每个 XAML 元素都映射到一个类。例如,`Window` 元素映射到 `WpfApplication1.Window1` 类,XAML 文件中的 `Button` 元素映射到 `System.Windows.Control.Button` 类,而 `Grid` XAML 元素映射到 `System.Windows.Control.Grid`。

`App.XAML` 和 `App.XAML.CS` 是入口点文件。如果您查看 `App.XAML.CS` 的代码,您会看到对需要加载的 XAML 文件的引用。应用程序中运行的第一个代码是 `App.XAML.CS` 中的 `void main()` 方法,该方法会加载 `Window1.XAML` 文件进行渲染。

我们现在可以将后台代码中的方法和函数连接到 XAML 文件元素中的事件。

从上面的代码片段可以看到,`Button` 元素如何将 `Click` 事件链接到 `MyButton_Click` 函数。`MyButton_Click` 是 `XAML.CS` 后台代码中的方法。因此,如果您现在运行代码,您可以看到按钮,如果您单击它,您将看到消息框。

什么是依赖属性?

依赖属性属于一个类,但可以在另一个类中使用。考虑下面的代码片段。

<Rectangle Height="72" Width="131" Canvas.Left="74" Canvas.Top="77" /> 

`Height` 和 `Width` 是 `Rectangle` 的常规属性。但 `Canvas.Top` 和 `Canvas.Left` 是依赖属性,因为它们属于 `Canvas` 类。`Rectangle` 使用它们来指定其在 `Canvas` 中的位置。

XAML 文件是编译的还是在运行时构建的?

XAML 文件通常是编译的,而不是在运行时解析。但它们也支持运行时解析。当我们构建一个基于 XAML 的项目时,您会在 `obi\Debug` 文件夹中看到一个扩展名为 `g.cs` 的文件。因此,对于每个 XAML 文件,您都会找到一个 `g.cs` 文件。例如,`Shiv.XAML` 会在 `obi\Debug` 文件夹中有一个 `Shiv.g.cs` 文件。简而言之,在运行时,您实际上看不到 XAML 文件。但是,如果您想进行 XAML 文件的运行时解析,它也允许这样做。

能否解释一下如何分离代码和 XAML?

这是 WPF 的最重要特性之一,即将 XAML 与要处理的代码分开。这样,设计人员就可以独立地处理应用程序的表示,而开发人员可以独立于表示方式来编写代码逻辑。

图 16.1:XAML 和后台代码的实际应用

上面是一个代码片段,显示了一个 XAML 文件和与 XAML 表示完全分离的代码。为了将一个类与一个 XAML 文件关联起来,您需要指定 `x:Class` 属性。XAML 对象上指定的任何事件都可以通过定义一个具有发送者和事件值的 `method` 来连接。您可以从上面的代码片段看到,我们将 `MyClickEvent` 链接到了后台代码中的一个事件。

注意:您可以在 `WindowsSimpleXAML` 文件夹中找到一个简单的示例。欢迎随意尝试代码……尝试比阅读理论性内容更有助于学习。

如何在后台代码中访问 XAML 对象?

要在后台代码中访问 XAML 对象,您只需将它们命名为与 XAML 文档中给出的名称相同。例如,在下面的代码片段中,我们将对象命名为 `objtext`,并且该对象在后台代码中以相同的名称定义。

图 16.2:访问 XAML 对象

注意:您可以从 `WindowsAccessXAML` 文件夹中获取源代码。

什么是 Silverlight?

Silverlight 是一个 Web 浏览器插件,可用于实现动画、图形以及音频/视频。您可以将 Silverlight 与 Flash 进行比较。我们可以使用 Flash 查看动画,并且它作为插件安装在浏览器中。

Silverlight 可以在 Windows 以外的平台运行吗?

是的,用 Silverlight 制作的动画可以在 Windows 以外的平台上运行。无论您想在哪个平台运行,只需要 Silverlight 插件。

拜托,WPF 也可以在浏览器中运行,为什么还需要 Silverlight?

是的,有一种称为 WPF 浏览器应用程序的东西,它可以在浏览器中运行 WPF。对于 WPF 浏览器应用程序,您需要在客户端安装 .NET Framework,而对于 Silverlight,您只需要插件。所以,换句话说,WPF 浏览器应用程序是操作系统相关的,而 Silverlight 则不是。Silverlight 插件可以在 Windows 以外的操作系统中运行,而我们都知道 .NET Framework 仅在 Windows 上运行。

Silverlight、WPF 和 XAML 之间有什么关系?

如前所述,XAML 是一个定义 UI 元素的 XML 文件。WPF 框架或 Silverlight 框架可以读取此 XML 文件进行渲染。微软首先开发了 WPF,并使用 XAML 文件向 WPF 框架描述 UI 元素。然后,微软扩展了 WPF,并制作了 WPF/e,这有助于在浏览器中渲染 UI。WPF/e 是 Silverlight 的代号。后来微软正式发布了 Silverlight。所以 XAML 只是定义了表示 UI 元素的 XML 结构。然后,WPF 和 Silverlight 这两个框架都读取 UI 元素并在各自的平台上渲染它们。

能否解释一下 Silverlight 的架构?

在我们讨论 Silverlight 架构之前,让我们先谈谈 Silverlight 在技术上到底是由什么组成的。Silverlight 借鉴了许多现有微软技术。我们可以将 Silverlight 插件视为 .NET Framework 核心、矢量动画、媒体和 JavaScript 等技术组合。

因此,我们可以将 Silverlight 架构看作是 .NET Framework 核心、AJAX 的一些组件以及核心 Silverlight 框架提供的动画、媒体等功能组合。我们可以将 Silverlight 架构视为四个重要模块的组合:

  • 一些 .NET Framework 组件:Silverlight 使用 .NET Framework 的一些组件。其中一个主要组件是 WPF。许多 UI 组件(`checkbox`、`button`、`textbox` 等)、XAML 解析等都取自核心 WPF 系统。它还从 WCF 等组件简化数据访问。它具有 CLR 用于内存管理、安全检查和垃圾回收。 .NET 的基类库用于字符串操作、算法、表达式、集合和国际化。
  • 表示核心 (Presentation Core):核心表示框架具有显示矢量 2D 动画、图像、媒体、DRM 的功能,并处理鼠标和键盘等输入。
  • 其他技术:Silverlight 与 AJAX 和 JavaScript 等其他技术进行交互。因此,它也借鉴了这些技术的一些功能。
  • 托管 (Hosting):Silverlight 动画最终在浏览器环境中运行。因此,它具有托管功能,有助于在浏览器中托管应用程序,公开 DOM 以便 JavaScript 可以操作 Silverlight 组件,并且它还具有安装程序功能,有助于在浏览器环境中安装 Silverlight 应用程序和插件。从架构图中可以注意到的一件事是,表示核心读取 XAML 文件进行渲染。XAML 是 .NET Framework 的一部分,而渲染部分由表示核心完成。

应用程序是典型的 HTML,在浏览器中运行。有一些标记会实例化 Silverlight 插件。现在,当用户与 Silverlight 应用程序交互时,它会将事件发送到 JavaScript 系统或 .NET 系统。这取决于您使用的编程语言。无论是 JavaScript 还是 .NET 的程序代码都可以调用 Silverlight 运行时并实现必要的功能。XAML 将由 Silverlight 运行时读取和解析,然后在浏览器中进行渲染。

制作简单 Silverlight 应用程序的各种步骤是什么?

我们使用 VS 2008 Web Express 版和 .NET 3.5 来制作这个示例。这是一个运行我们第一个 Silverlight 应用程序的六步过程。所以让我们一步一步地进行。

对于此示例,我们选择了第一个选项。点击 **OK** 后,您应该会看到 Silverlight 的完整 IDE 环境。

所以让我们回顾一下我们看到的 IDE 视图的一些基本要点。您会看到有两个项目:您的 Web 应用程序和 Silverlight 应用程序。在 Silverlight 应用程序中,我们有两个 XAML 文件:`App.XAML` 和 `Page.XAML`。`App.XAML` 包含全局级别的信息。

<%@Register Assembly="System.Web.Silverlight" 
   Namespace="System.Web.UI.SilverlightControls" TagPrefix="asp" %>

我们还需要从 Silverlight 命名空间引用 `ScriptManager`。`ScriptManager` 控件是 AJAX 的一项功能。此控件的主要目的是管理 JavaScript 库的下载和引用。

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

最后,我们需要引用 Silverlight 应用程序。您可以看到我们在源中引用了 XAP 文件。XAP 文件只不过是一个编译后的 Silverlight 应用程序,经过压缩和打包。它基本上包含了应用程序所需的所有文件,并以压缩格式存储。如果您将文件重命名为 `ZIP` 扩展名,您可以使用 WinZIP 打开它。

<asp:Silverlight ID="Xaml1" runat="server" 
   Source="~/ClientBin/MyFirstSilverLightApplication.xap"
   MinimumVersion="2.0.31005.0" Width="100%" Height="100%" />

所以,您的最终 ASPX / HTML 代码使用 Silverlight 应用程序如下所示。

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Register Assembly="System.Web.Silverlight" Namespace="System.Web.UI.SilverlightControls"
TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" style="height:100%;">
<head runat="server">
<title>MyFirstSilverLightApplication</title>
</head>
<body style="height:100%;margin:0;">
<form id="form1" runat="server" style="height:100%;">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<div style="height:100%;">
<asp:Silverlight ID="Xaml1" runat="server" 
   Source="~/ClientBin/MyFirstSilverLightApplication.xap" 
   MinimumVersion="2.0.31005.0" Width="100%" Height="100%" />
</div>
</form>
</body>
</html>

  • 步骤 1:我们需要做的第一件事是从 http://www.microsoft.com/downloads/details.aspx?familyid=FB7900DB-4380-4B0F-BB95-0BAEC714EE17&displaylang=en 安装 Silverlight SDK 工具包。
  • 步骤 2:安装 Silverlight SDK 后,您应该能够使用 Silverlight 模板。所以当您创建新项目时,您会看到一个“SilverLight Application”模板,如下图所示。

  • 步骤 3:点击 **OK** 后,您会看到一个如下所示的对话框,其中有三个选项。
    • Add an ASP.NET web project to the solution to host Silverlight:这是默认选项,它将创建一个新的 Web 应用程序项目,该项目已配置为托管和运行您的 Silverlight 应用程序。如果您正在创建一个新的 Silverlight 应用程序,那么这个选项是最佳选择。
    • Automatically generate a test page to host Silverlight at build time:此选项会在每次尝试调试和测试应用程序时在运行时创建一个新页面。如果您只想专注于您的 Silverlight 应用程序,那么这个选项值得考虑。
    • Link this Silverlight control into an existing website:如果您有一个现有的 Silverlight 应用程序,那么此选项有助于将 Silverlight 应用程序与现有 Web 应用程序项目链接起来。在新项目中您将看不到此选项,您需要有一个现有的 Web 应用程序。
  • 步骤 4:现在为了简单起见,我们只使用 `TextBlock` 标签来显示文本。您可以看到,当我们输入 `Page.XAML` 时,它会显示在查看器中。
  • 步骤 5:现在我们需要在 ASPX 页面中消费 Silverlight 应用程序。所以,在 HTML / ASPX 页面中,我们首先需要使用 `Register` 属性引用 Silverlight 命名空间。
  • 步骤 6:最后,将 Web 应用程序设置为启动项目,并将此页面也设置为启动页面并运行它。您应该会高兴地看到您的第一个 Silverlight 应用程序正在运行。

其他 Silverlight FAQ

历史

  • 2009 年 3 月 24 日:初始版本
© . All rights reserved.