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

Silverlight 初学者指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (25投票s)

2011年11月30日

CPOL

25分钟阅读

viewsIcon

199981

downloadIcon

8046

《Silverlight 4 乐趣》第 11 章 更多信息请访问 http://silverlightfun.com

    Buy 'Fun with Silverlight 4' book from Amazon.com

    up.gif  购买《Silverlight 4 乐趣》书籍 访问支持网站

第 11 章 - Silverlight 初学者指南 

“最高尚的乐趣是理解的乐趣。” - 列奥纳多·达·芬奇

本章内容

  • Silverlight 基础
  • Silverlight 和 .NET 框架
  • Hello Silverlight

本书是关于 Silverlight 解决方案的。在本章中,我们将深入了解 Silverlight 插件的含义、Silverlight 应用程序的组件以及 .NET 框架的作用。

Silverlight 非常适合以下类型的应用程序
  • 高级图形和动画
  • 使用 AJAX 技术进行数据可视化
  • 丰富的互动游戏、Web 小工具和广告横幅
  • 高级媒体应用程序

本章旨在为您提供快速概览,并为后续章节奠定基础。让我们开始吧。

Silverlight 基础

Silverlight 用于创建富互联网应用程序。它既是一种用户界面技术,也是一个用于创建 Web 应用程序的强大平台。它与 .NET 平台集成,因此您不仅可以创建交互式应用程序,还可以增强当前的 Web 应用程序,为用户提供更好的体验。

Silverlight 应用程序将在本地机器上运行,但要在 Web 服务器上运行 Silverlight 应用程序,您需要在服务器支持的文件类型配置中添加扩展名 .XAP 和 MIME 类型 application/x-silverlight。

Silverlight 技术由四个主要部分组成
  • Silverlight 插件
  • Silverlight 主机,即网页
  • Silverlight 应用程序文件 (.XAP)
  • 接口语言,可扩展应用程序标记语言 (XAML)

Silverlight 插件是用于在浏览器中渲染 Silverlight 应用程序的引擎,主机是托管 Silverlight 应用程序的网页,而 Silverlight 应用程序是使用 Microsoft Visual Studio 和 Expression Blend 开发的互联网应用程序。

Silverlight 技术的核心是可扩展应用程序标记语言 (XAML),它是一种声明式编程语言,用于创建丰富的矢量图形和动画,并用于 Silverlight 应用程序文件。图 11.1 显示了 Silverlight 技术的概述

11fig01.png

图 11.1 XAML 是 Silverlight 应用程序的核心。

在接下来的几节中,我们将更详细地讨论这些内容。

Silverlight 插件

Silverlight 是网页浏览器的插件。插件是为增强或扩展功能而创建的应用程序扩展。其他网页浏览器插件的示例包括 Flash、Java 小程序、Windows Media Player 和 QuickTime。要在浏览器中运行 Silverlight 应用程序,用户必须首先下载并安装 Silverlight 插件。Silverlight 插件是运行 Silverlight 应用程序的完整环境。该插件包含 XAML 解析器、媒体管道、演示引擎以及使用嵌入式公共语言运行时 (CLR) 的 .NET 编程层。该插件还提供了一种 Silverlight 应用程序与浏览器通信的方式。图 11.2 显示了 Silverlight 插件的组件。

11fig02.png

图 11.2 该插件包含渲染 Silverlight 应用程序所需的组件。

Silverlight 插件由以下子组件和功能组成
  • 支持多核的演示引擎
    • 绘制矢量图形和形状
    • PNG/JPG 解码器
    • 图像缓存、文本和字形缓存
    • 动画系统
    • 3D 渲染引擎
  • XAML 解析器
  • .NET 框架子集
    • 核心公共语言运行时 (CLR)
    • .NET 基类库
  • 媒体功能
    • 媒体管道
    • 下载和流媒体
    • 音频/视频解码器
  • 浏览器交互
    • HTML 桥接
    • 鼠标和键盘输入和事件
    • 墨迹支持
  • 下载器

Silverlight 插件驻留在浏览器中,当您导航到具有 Silverlight 应用程序嵌入代码的网页时,它会被激活。

在网页上渲染 Silverlight 的步骤

当用户导航到带有 Silverlight 的页面时,插件按照图 11.3 所示的以下顺序执行操作

11fig03.png

图 11.3 CLR 启动,然后提取 XAML 和其他程序集。

  1. 用户打开一个带有 Silverlight 的网页
  2. 该页面具有引用 XAML 应用程序 (.XAP) 文件的嵌入代码
  3. Silverlight 插件安装在浏览器中,然后下载 .XAP 文件
  4. 启动嵌入式公共语言运行时 (CLR),它是执行和管理 Silverlight 应用程序的环境
  5. 从 XAML 应用程序 (.XAP) 文件中提取 XAML 文件和程序集
  6. 加载 .NET 程序集
  7. 创建 Silverlight 控件实例,包括
    1. 创建用户界面元素树
    2. 管理用户界面的布局
    3. 绘制用户界面

Silverlight 应用程序使用 HTML Object 标签托管在网页上。我们将在下一节“Silverlight 主机”中讨论其工作原理。

Silverlight 主机

Microsoft Visual Studio 和 Expression Blend 都允许您创建 Silverlight 应用程序。这些应用程序本质上创建了一个 XAML 应用程序文件 (.XAP) 文件,该文件通过对象标签中的链接引用。

您可以通过三种方式在网页中托管 Silverlight 应用程序文件
  1. 使用 <object> 标签在任何 HTML 页面中托管 Silverlight
  2. 使用 Silverlight 控件在 ASPX 页面中托管
  3. 使用 MediaPlayer 控件在 ASPX 页面中托管
使用 <object> 标签类似于嵌入任何 ActiveX 控件,如媒体播放器或 Flash 文件。这是一个嵌入 Silverlight 对象的示例代码,该对象链接到 HelloWorld.xap。
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2">





</object>

Visual Studio 允许创建在 Web 表单中使用 Silverlight 用户控件的 Web 项目。此用户控件最终会转换为前面示例中所示的对象标签。Silverlight 还允许在 Web 表单 (ASPX) 中使用媒体控件。

Silverlight 控件也可以通过将用户控件从工具箱拖到网页来嵌入到现有或新的 Web 应用程序中。要使用这些控件,您还需要一个 Script-Manager 控件,该控件用于管理脚本文件。参见图 11.4。

11fig04.png

图 11.4 工具箱中提供了 Silverlight 和 MediaPlayer 控件。

这是一个在 Web 表单 (ASPX) 中使用 Silverlight 控件的示例
<asp:Silverlight ID=”Xaml1” runat=”server” Source=”HelloWorld.xap” Minimum- Version=”4.0.50826.0” Width=”100%” Height=”100%” />
在 Web 表单 (ASPX) 中使用 MediaPlayer 控件
<asp:MediaPlayer ID=”MediaPlayer1” runat=”server” Height=”240px” Width=”320px”> 

Silverlight 应用程序文件 (.XAP)

Silverlight 应用程序文件是一个单独的压缩 .ZIP 文件,其扩展名已更改为 .XAP (XAML Application)。它由许多 XAML 文件、.NET 程序集和其他资源组成。当您构建 Silverlight 应用程序时,Visual Studio 会将所有相关文件压缩到此单个文件中。

.XAP 文件在 HTML 中的 Silverlight 对象标签内引用,并由 Silverlight 插件加载、解析和执行。.XAP 文件包含 Silverlight 应用程序的实际逻辑和接口。请参阅本章末尾“Hello World”应用程序的说明,以便在开发应用程序时进行跟踪。

请注意,有四个文件 - App.xaml、App.xaml.cs、MainPage.xaml 和 MainPage.xaml.cs。这些文件由 Visual Studio 自动创建。App.xaml 和 .cs 文件用于应用程序级别属性和事件。MainPage.xaml 和 .cs 文件是包含应用程序第一个视觉效果的文件。请注意 .cs 文件中的 InitializeComponent 方法。此方法将 XAML 文件与代码结合起来。

为了更好地理解代码交互,我们将在 Visual Studio 中将 HelloWorld 文件夹作为网站打开。这将显示 Silverlight 应用程序中未显示的隐藏文件夹和文件。

在解决方案资源管理器中,单击 HelloWorld 解决方案,然后单击添加现有网站,选择 HelloWorld 文件夹,然后单击确定。有关更新的资源管理器视图,请参见图 11.5。在网站视图中,您将找到两个新文件夹

  • Obj 文件夹,用于中间处理
  • Bin 文件夹,用于存储项目编译后的二进制文件
图 11.5 显示了 HelloWorld 应用程序的网站视图,其中包含 OBJ 文件夹(左)和 Debug 文件夹(右)的详细信息。

11fig05.PNG

图 11.5 Obj/Debug 文件夹包含中间文件。

Obj/Debug 文件夹存储对象和中间文件,然后将它们链接在一起

  • Page.g.cs 和 App.g.cs 是与每个 xaml 文件对应的中间文件。“g”代表生成。每个 XAML 文件都转换为此分部类文件。此文件声明 InitializeComponent 方法,并加载相应的 xaml 文件作为组件。
  • HelloWorld.g.resources 文件是所有 xaml 文件的压缩二进制形式,有时也称为 BAML 文件
  • HelloWorld.dll 是由 Visual Studio 创建的程序集,在压缩为 .XAP 之前也会复制到 BIN 文件夹
  • XAPCacheFile 是程序集清单的中间文件
  • HelloWorld.PDP 是项目相关文件,包含调试和项目状态信息
  • FilelistAbsolute.txt,顾名思义,存储了在编译到动态链接库之前使用的文件的绝对路径

Bin/Debug 是存储编译文件的文件夹。构建过程产生的文件是

  • HelloWorld.XAP:文件是最终的压缩 Silverlight 应用程序文件,其中包含 HelloWorld.dll 以及 AppManifest.XAML。您可以通过将扩展名更改为 .zip 并打开它来查看。
  • TestPage.html:嵌入 HelloWorld.XAP 文件的主机文件
  • HelloWorld.dll:由 Visual Studio 创建的程序集,包含 XAML 文件、所需的 .NET 程序集以及与应用程序相关的其他嵌入资源。
  • AppManifest.xaml:应用程序清单文件,存储应用程序的入口点,描述应用程序在运行时应绑定到的程序集的名称和源,还包含应用程序使用的程序集的元数据。

要部署您的 Silverlight 应用程序,您需要将 TestPage.html 和 HelloWorld.XAP 文件上传到 Web 服务器。HelloWorld.XAP 文件包含所有必需的文件。HelloWorld 应用程序在 .XAP 中包含以下文件

  • AppManifest.xaml
  • HelloWorld.dll

复杂的 Silverlight 应用程序文件将包含其他 .NET 程序集、xaml 文件以及图像和媒体文件等其他资源。当 Silverlight 插件在 Web 浏览器中加载 HelloWorld.zap 文件时,它会首先读取 AppManifest 文件以找出入口点。

入口点是需要首先加载的 dll 的名称,并在 Entry-PointAssembly 字段中输入。在 AppManifest.XAML 中,其值为 HelloWorld。清单文件还将包含对运行时应用程序应加载的其他所需程序集的引用作为 AssemblyPart。







在我们的示例中,我们只有一个程序集,但 Deployment.Parts 可以包含应用程序中使用的所有程序集的列表。其他程序集将根据需要加载。现在让我们看看 HelloWorld.dll。图 11.6 显示了 .NET Reflector 中的 HelloWorld.dll。

11fig06.PNG

图 11.6 XAML 文件存储在 HelloWorld 程序集内的资源部分中。

图 11.6 显示了 HelloWorld.dll 的内部视图。请注意,DLL 文件已将 XAML 文件保存在资源中,代码隐藏文件成为 Silverlight 应用程序的标准方法。

Silverlight 插件遵循以下事件序列
  1. XAP 文件被提取
  2. AppManifest.XAML 文件被查询以获取入口点程序集
  3. 加载入口点程序集(在我们的例子中是 HelloWorld.dll)
    1. 调用 Application InitializeComponent
    2. InitializeComponent 链接并加载 App.xaml,后者加载应用程序资源
    3. 调用 Application Startup 方法
    4. Startup 方法将应用程序的 RootVisual 设置为 Page 对象
      1. 创建 Page 的新实例
      2. 调用 Page 的 InitializeComponent
    5. 链接并加载 MainPage.xaml
    6. 根据 MainPage.xaml 渲染 Silverlight 用户界面
  4. 网页显示 MainPage.xaml 的内容

当您创建一个新的 Silverlight 应用程序时,MainPage.xaml 成为默认的可视界面。在我们的示例中,将显示 MainPage.xaml 中的“Hello World”文本块。MainPage.xaml 之所以丰富,是因为接口标记语言的矢量质量。尝试将字体大小更改为 34,并注意它如何无损地缩放。这要归功于可扩展应用程序标记语言 (XAML),我们将在下一节中讨论它。

Silverlight XAML

Silverlight XAML(可扩展应用程序标记语言)是一种接口标记语言,它有一个可视文件 (MainPage.xaml) 和一个用于逻辑的 .NET 代码隐藏文件 (MainPage.xaml.cs)。可视部分是高级 HTML,而代码隐藏文件带来了 .NET 类型安全、托管环境的健壮性。这两个部分使 XAML 成为一种简单而强大的语言。

XAML = MainPage.xaml + MainPage.xaml.cs

可视部分从 xml 扩展而来,允许您声明性地定义用户界面。它很简单,您有字段、属性和特性,并且您会得到您声明的内容。Main-Page.xaml.cs 包含应用程序逻辑和事件声明。让我们更详细地了解这些内容。

Silverlight XAML 可以分为两部分

  • 可扩展标记语言文件(可视部分)
  • XAML .NET 文件(应用程序部分)

可扩展标记语言文件(可视部分)

XAML 比 HTML 先进得多,它允许您声明对象、形状的标签,并允许 URL 链接到 jpg、png 图像和其他多媒体文件。虽然 HTML 解析是在运行时完成的,但 XAML 标记是编译的。

您在 XAML 中声明的对象和形状是矢量图像,可以无损缩放。它还支持高级抗锯齿功能,用于清晰的图像边缘和使用故事板标签的 2D 动画。XAML 中的动画也是声明性的——不涉及编程。

XAML 标记文件支持

  • 矢量图形
  • 基于标签的 2D 动画
  • 允许链接图像和多媒体文件

XAML 的第二个方面是可扩展性。XAML 基于 XML,因此除了为对象和形状定义的默认 xml 命名空间中可用的标签外,您还可以创建自己的命名空间并使用自己的标签。事实上,正是 Silverlight XAML 文件的可扩展性允许定义代码隐藏文件。

让我们看看我们在 HelloWorld 应用程序中创建的 MainPage.xaml。




 Hello World !


请注意以下四个元素

  1. 根元素 UserControl
  2. x:Class 的重要性
  3. 映射 (xmlns 和 xmlns:x) 和 XAML 命名空间
  4. Grid 和 TextBlock 对象

让我们讨论一下这些内容,以便更好地理解嵌入式代码。

根元素

UserControl 是 XAML 文件的根元素。Silverlight 允许在 Silverlight 项目中使用两种 XAML 模板:应用程序模板和用户控件模板,它们具有相应的根元素。

一个 Silverlight 项目将包含这两个默认文件:App.xaml (Application) 和 MainPage.xaml (UserControl)。HelloWorld 程序有一个应用程序文件 (App.xaml),它使用一个用户控件 (MainPage.xaml) 进行显示,但您可以在同一个项目中拥有多个模板。有关类图,请参见图 11.7。

11fig07.PNG

图 11.7 App 类处理整个应用程序。

App 类处理整个应用程序,Page 类处理应用程序内部的单个接口。在任何时候,Silverlight 的根元素都设置为 Page 类。默认情况下,这在 Application Startup 事件中设置。

private void Application_Startup(object sender, StartupEventArgs e){
this.RootVisual = new Page1(); }

要更改用户界面,您需要将 RootVisual 更改为不同的 Page。

X:Class

X:Class 属性允许您在 XAML 文件中添加您的命名空间。该属性声明命名空间和类的值。默认情况下,每个 MainPage.xaml 文件都与 Page 类(即代码隐藏文件)关联。您可以使用此属性添加更多命名空间。编译器使用这些值生成中间分部类 (Page.g.cs),该类稍后与代码隐藏文件合并。此属性将可视 XAML 与代码隐藏文件链接起来。

//	For x:Class="HelloWorld.Page" Namespace, class generated is shown namespace HelloWorld { class Page : UserControl {} }

命名空间是程序集名称,由于这是 UserControl Page 类的属性,因此它是从程序集继承的。

xmlns 和 xmlns:x

在根元素中,我们看到了两个属性声明:xmlns 和 xmlns:x。这些属性指示 XAML 处理器哪些 XML 命名空间 (xmlns) 包含标记将引用的元素定义。让我们更详细地了解 XML 命名空间。

XML 命名空间

XML 命名空间是与一组 XML 元素和属性关联的上下文,由唯一标识符定义。当您在 XML 文件的根中定义 XML 命名空间时,您声明文件中定义的对象将遵循预定义的语言元素。XML 命名空间确保 XML 文件中元素及其属性名称的唯一性。

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

正如我们所看到的,xmlns 标识符是 URI(统一资源标识符),但不需要指向实际资源。

在 Silverlight 中,这适用于 XAML 文件,XAML 文件是 XML 的扩展版本,因此它也被称为 XAML 命名空间。XAML 命名空间定义了许多常用的功能,这些功能对于基本功能是必需的。它还定义了一组可通过 XAML 处理器访问的元素、属性和特性。

默认命名空间 (Xmlns)

xmlns 属性指示默认 XML 命名空间。所有未指定前缀的元素都映射到默认命名空间。这包括所有 UI 元素,如 Grid、TextBlock、矢量和动画对象。

XML 命名空间 http://schemas.microsoft.com/winfx/2006/xaml/presentation 是 Windows Presentation Foundation (WPF) 的命名空间。Silverlight 技术起源于 WPF,因此第一个命名空间默认为 WPF 命名空间。

这些元素在 PresentationFramework.dll 中定义

XAML 语言命名空间 (xmlns:x)

第二个命名空间特定于 XAML 语言并已映射。需要使用此命名空间的每个元素或属性都必须使用前缀“x:”。我们在上面的 XAML 示例中看到了“x:Name”和“x:Class”属性,这两个属性使用 XAML 语言命名空间。因此,在以下示例中,尽管 TextBlock 使用默认命名空间,但 Grid 的 X:Name 属性特定于 XAML 语言命名空间。


Hello World!

图 11.8 显示了具有常见元素的两个命名空间

11fig08.PNG

图 11.8 命名空间包含元素定义。

Grid 和 TextBlock

XAML 中的 Grid 对象类似于 HTML 中的 Table 标签,TextBlock 和 label 标签。默认情况下,Grid 具有一行一列。我们在 Grid 内的 TextBlock 中输入了“Hello World”,字体大小为 24。在 HTML 中,这类似于一个带文本的无边框表格,其中包含一行一列的标签。

不同之处在于 XAML 中文本块的质量更好,因为它采用矢量格式。HTML 中的相同文本无法以该质量进行缩放。

XAML .NET 文件(应用程序部分)

Silverlight XAML 也是一个强大的应用程序,并被公共语言运行时 (CLR) 视为 .NET 类。XAML 应用程序部分有三个方面

  • MainPage.xaml.cs,.NET 代码隐藏文件与 XAML 文件关联。
  • Page.g.cs,为 XAML 文件 (MainPage.xaml) 生成的分部类文件
  • 基于 XAML 文件创建 BAML(二进制应用程序标记语言)文件,并作为资源 (HelloWorld.g.resources) 存储在程序集中。

MainPage.xaml.cs

为每个 XAML 文件创建一个 .NET 代码隐藏文件。XAML 文件使用 X:Class 属性来关联此文件。代码隐藏文件包含函数和方法。XAML 允许在属性中声明事件名称,但事件的逻辑在此代码隐藏文件中声明。

Page.baml

二进制应用程序标记语言 (BAML) 文件是一个中间文件,它成为程序集中资源的一部分。它是源 XAML 文件中定义的整个对象层次结构和属性的二进制表示。它已被预标记化(分解成离散元素),因此在运行时从资源文件加载 BAML 比加载 xaml 文件快得多。这使得 XAML 在开发过程中保留 XML 的易用性,而在运行时不产生性能开销。

Page.g.cs

在构建过程中,为每个 xaml 文件生成一个扩展名为 .g.cs 的中间分部类文件。Page.g.cs 的作用包括以下内容

  • 它为每个带有 X:name 属性的元素定义一个字段
    internal System.Windows.Controls.Grid LayoutRoot;
    internal System.Windows.Controls.TextBlock TextHello;
    
  • 它声明 InitializeComponent 方法,该方法通过调用 LoadComponent() 创建对象树,并从程序集资源中加载 MainPage.xaml
    System.Windows.Application.LoadComponent(this, new System.Uri("/ HelloWorld;component/MainPage.xaml", System.UriKind.Relative));
    
  • InitializeComponent 方法还将使用属性 x:Name 创建的元素链接到它们各自的名称,以便您可以直接使用它们。字段 LayoutRoot 和 TextHello 将设置为当时为其创建的网格和文本框的值。
    this.LayoutRoot = ((System.Windows.Controls.Grid)(this. FindName("LayoutRoot")));
    this.TextHello = ((System.Windows.Controls.TextBlock)(this. FindName("TextHello")));
    

Page.g.cs 文件在运行时与代码隐藏文件 MainPage.xaml.cs 合并以创建一个类。

 
Page Class = MainPage.xaml + MainPage.xaml.cs becomes,
Page Class = Page.g.cs + MainPage.xaml.cs + HelloWorld.g.resources

构建过程将可视化部分和应用程序部分结合起来,形成一个单独的程序集 (HelloWorld.dll)。XAML 中标记和应用程序的这种分离提供了更简单的开发和 .NET 的健壮性。图 11.9 总结了 XAML 的三个方面。

11fig09.PNG

图 11.9 XAML 是一种可扩展应用程序标记语言。

Silverlight 和 .NET 框架

Silverlight 的真正强大之处来自于 .NET 框架。Silverlight 中的 .NET 支持范围从基类库到 .NET 框架 3.5 中提供的高级互联网功能,如 AJAX 和 LINQ。所有这些功能都通过 Silverlight 插件中嵌入的公共语言运行时 (CLR) 进行管理。

Silverlight 中的 .NET 应用程序支持可以分为两部分

  • 嵌入式公共语言运行时 (CLR)
  • .NET 框架库

.NET 核心公共语言运行时驻留在浏览器中的 Silverlight 插件中,并随 Silverlight 插件一起安装。核心 CLR 负责在浏览器中执行 Silverlight 应用程序。.NET 框架库是渲染 Silverlight 应用程序和所有其他功能所必需的。

了解嵌入式 CLR

.NET 嵌入式 CLR 是负责管理 Silverlight 应用程序 .NET 部分的引擎。CLR 实例化 Silverlight 应用程序,将其加载到内存中,使用演示框架库渲染它,并将其与网络库动态链接,以实现数据和互联网相关功能。它管理内存并确保类型安全和安全功能。嵌入式 CLR 提供以下功能

  • 自动内存管理
  • 垃圾回收
  • 即时编译器
  • 托管异常处理
  • 类型安全
  • 安全功能
  • 多线程

这些功能类似于用于 .NET 应用程序的 CLR。我们将在示例中看到更多详细信息。下一部分是 Silverlight 可用的 .NET 框架库。

Silverlight 的 .NET 框架库

Silverlight 支持的 .NET 框架库包括基类库、泛型、集合、正则表达式、LINQ 和线程。

.NET 框架库

  • 基类库
  • 表示层
  • 数据框架
  • 通信基础
  • Silverlight 特有的其他库

基类库

Silverlight 中的基类库旨在提供 .NET 应用程序的所有基本功能,例如输入/输出 (IO) 操作、文本、正则表达式、集合和泛型。以下是基类库支持的命名空间列表

  • System 用于核心对象
  • System.IO 处理输入和输出
  • System.Text 支持文本的存储和操作
  • System.Text.RegularExpressions 用于正则表达式支持
  • System.Resources 允许在程序集中嵌入资源
  • System.Collections.Generics 允许 Silverlight 中的泛型
  • System.Cryptography 强制执行安全功能
  • System.Globalization 用于多语言支持
  • System.Reflections 用于程序集相关信息

表示层

演示基础由用于在网页上渲染 Silverlight 应用程序的所有库组成。这包括与标记、形状、矢量、动画以及用户控件和多媒体文件相关的库。这还包括用于 Silverlight 应用程序和部署的 Windows 库。以下是命名空间列表

  • System.Windows 用于应用程序和部署
  • System.Windows.Shapes 用于 Ellipse、Line、Path 和 Polygons
  • System.Windows.Documents 用于 Glyphs 和换行符
  • System.Windows.Media 支持画笔和变换
  • System.Windows.Media.Animation 用于动画和故事板
  • System.Windows.Threading 支持 Dispatcher 和 DispatcherTimer
  • System.Windows.Browser 用于与 HTML 浏览器通信
  • System.Windows.Controls 标准控件和用户控件

数据框架

下一组用于与 XML、JSON 数据和 LINQ 相关的 .NET 库

  • System.XML 提供 XMLReader 和 XMLWriter
  • System.Runtime.Serialization 提供数据和 XML Serializer
  • System.Runtime.Serialization.JSON 支持 JSON 数据
  • System.Linq 用于高级 LINQ 支持
  • System.XML.Linq 用于 LINQ 到 XML 转换

通信基础

通信基础与 Web 中的数据通信有关。它旨在支持 AJAX 技术、Web 服务和 RSS、Atom Feed 格式。

  • System.Net 提供 Ajax、HTTPWebRequest、WebClient 和 Sockets
  • System.ServiceModel 支持 Web 服务客户端和服务引用
  • System.ServiceModel.Channel 用于绑定和消息
  • System.ServiceModel.Syndications 用于 RSS 和 Atom Feed

Silverlight 特有的其他库

Silverlight 提供了创建丰富交互式应用程序的额外功能

  • System.IO.IsolatedStorage
  • 通过 System.Windows.Controls 中的 MultiScale 类实现 DeepZoom
  • System.ComponentModel 用于 Background Worker(异步编程)
  • 通过 System.Windows.Browser 实现 HTML 托管代码交互
  • 通过 System.XML 支持 XML、JSON 和 POX (Plain Old XML) 数据
  • 支持 IronRuby 和 IronPython 的动态语言运行时

图 11.10 概述了 Microsoft Silverlight 中可用的 .NET 库。

11fig10.PNG

图 11.10 Silverlight 包含 .Net 框架的最佳部分。

创建 Silverlight 应用程序

让我们从两个简单的程序开始。

  1. Hello World – 基本应用程序
  2. Silverlight Rocks – 具有动态资源的事件驱动 Silverlight 应用程序

第一个示例应用程序已在本章中讨论过,第二个示例旨在让您体验事件驱动的 Silverlight 编程。

创建 Hello World 应用程序

问题

如何在 Silverlight 中创建 Hello World?

解决方案

Hello World 应用程序通常被视为第一个也是最简单的程序。该程序将演示 App 类(派生自 Application 类)公开的方法。参见图 11.11。

11fig11.PNG

图 11.11 Application 类的 RootVisual 属性定义了 Silverlight 应用程序的视觉元素。

创建 HelloWorld Silverlight 应用程序的步骤

  1. 打开 Visual Studio,单击文件、新建、项目,在项目类型中选择 Silverlight,在模板中选择 Silverlight 应用程序。在名称和解决方案字段中输入 HelloWorld,然后单击确定。
  2. 选择自动生成一个测试页面来托管 Silverlight,然后单击确定。
  3. 打开编辑器中的 MainPage.xaml 文件,在 Grid 标签内添加一个 TextBlock 控件,并输入 Hello World,如下所示
    
    Hello World !
    
    
  4. 按 F6 构建解决方案,按 CTRL F5 运行带有 Silverlight 的测试页面。参见图 11.12。

11fig12.PNG

图 11.12 Hello World 文本无损地缩放。

创建 Hello World 应用程序后,查看 Visual Studio 中的应用程序文件。这里的重点是 MainPage 类,它用于设置 App.cs 的 RootVisual 属性。这在 Application_Startup 方法中完成。该应用程序具有以下四个公共方法:Startup、Exit、UnhandledException 和 ReportErrortoDOM。另请注意基 Application 类的属性。

XAML
App.xaml



MainPage.xaml


Hello World!


代码
App.xaml.cs
using System;
using System.Windows;
namespace HelloWorld {
public partial class App : Application {
public App() {
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException; InitializeComponent();
}
private void Application_Startup(object sender, StartupEventArgs e) {
this.RootVisual = new Page();
}
private void Application_Exit(object sender, EventArgs e){}
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) {
if (!System.Diagnostics.Debugger.IsAttached)	{ e.Handled = true; Deployment.Current.Dispatcher.BeginInvoke(delegate{ReportErrorToDOM;});
}
}
private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e) {
try	{
string errorMsg = e.ExceptionObject.Message +	11
e.ExceptionObject.StackTrace;
errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n"); System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight 2 Application " + errorMsg + "\");");
}
catch (Exception){}
}
}
MainPage.xaml.cs
using System;
using System.Windows.Controls;
namespace HelloWorld {
public partial class Page : UserControl {
 public Page() { InitializeComponent();}
 }
}

创建一个事件驱动的应用程序

问题

如何创建一个带有事件的简单 Silverlight 应用程序?

解决方案

这个程序旨在为您提供创建基于 Silverlight 应用程序的下一步。从现在开始,我们将只关注 Page 类(参见图 11.13),它是可视元素。在这个示例中,我们还将了解如何在 Silverlight 用户界面中连接事件并理解如何添加和使用资源。

11fig13.PNG

图 11.13 Page 是一个 UserControl。

Silverlight Rocks 程序在用户点击用户界面(参见图 11.14)的点显示一个笑脸,并提供单独删除或全部删除的选项。

该应用程序旨在向您展示 Silverlight 中的事件驱动编程。我们将在后面的章节中更详细地了解读取 XAML 和 XML 文件。有两种不同颜色的笑脸:一种作为内容(smiley.xaml Build Action= Content)添加,另一种作为资源(smileypink.xaml Build Action=Resource)添加到应用程序中。

在 MainPage.xaml 中首先要注意的是 LayoutRoot_MouseLeftButtonUp。Silverlight 中的每个 UIElement 都公开以下交互方法

  • Loaded (加载)
  • SizeChanged
  • 布局已更新
  • BindingValidationError

以及图 11.14 中所示的以下事件

11fig14.PNG

图 11.14 UIElement 带有许多输入事件。

所有这些方法都可以在代码中动态创建,也可以在设计时创建。这意味着当用户点击 LayoutRoot 元素(此处为 canvas)时,事件会随发送者对象和 MouseButtonEventArgs 一起触发(参见下面的代码列表)。鼠标事件参数提供了用于定位动态创建的笑脸的坐标。

在 Add Smiley 方法中,我们随机从内容或资源中选择一个笑脸。不同之处在于,内容笑脸在 XAP 文件中,资源笑脸转换为二进制资源,并存储在 HelloSilverlight.dll 的资源部分中并从中检索。

其他值得注意的项目:LayoutRoot.Children.Add 和 LayoutRoot.Children.Remove 方法,它们提供了一种标准方式来在用户界面中添加 UIElement,以及使用 HtmlPage.Window.Alert 和 HtmlPage.Window.Confirm 方法调用的 JavaScript Alert 消息。

11fig15.PNG

图 11.15 Silverlight 支持警报框。

XAML






代码
using System;
using System.Windows;
using System.Windows.Controls; using System.Windows.Input; using System.Xml;
using System.Windows.Browser; using System.Windows.Markup; namespace HelloSilverlightWorld{
public partial class Page : UserControl {
bool ResetFlag;
public Page() 
 { InitializeComponent(); }
private void LayoutRoot_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
 UIElement s = (UIElement)e.OriginalSource;
 Point MousePosition = e.GetPosition(LayoutRoot); AddSmiley(MousePosition.X,  MousePosition.Y); 
 }
private void Smiley_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
 {
 if (HtmlPage.Window.Confirm("Delete Smiley?"))
 { 
 RemoveSmiley(sender); 
 } 
}
private void Reset_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
 { 
 RemoveAllSmiley();
 }
private void AddSmiley(double x, double y)
 { 
 XmlReader xmlReader ;
 if ((int)x % 2==0) xmlReader = XmlReader.Create("files/smiley.xaml");
 else xmlReader =
  XmlReader.Create("/HelloSilverlight;component/files/smileypink.xaml");
  xmlReader.MoveToContent();
  UIElement MySmiley = (UIElement)XamlReader.Load(xmlReader.ReadOuterXml());
  MySmiley.SetValue(Canvas.TopProperty, y);
  MySmiley.SetValue(Canvas.LeftProperty, x);
  MySmiley.MouseLeftButtonDown += new
   MouseButtonEventHandler(Smiley_MouseLeftButtonUp); 
  LayoutRoot.Children.Add(MySmiley);
  if (!ResetFlag) 
   ResetText(); 
 }
private void ResetText() 
 { 
 ResetFlag = true;	
 Reset.Text = "(Click To Reset)";
 Reset.MouseLeftButtonDown += new
  MouseButtonEventHandler(Reset_MouseLeftButtonUp); 
 }
private void RemoveSmiley(Object sender)
{
 LayoutRoot.Children.Remove((UIElement)sender); 
}
private void RemoveAllSmiley() 
{
 if (HtmlPage.Window.Confirm("Delete All Smiley?")) 
 {
 int TotalCount = LayoutRoot.Children.Count; 
  for (int i = TotalCount - 1; i > 1; i--) 
  { 
  LayoutRoot.Children.RemoveAt(i); 
  }
  ResetFlag = false;	
  Reset.Text = "(Click Anywhere)"; 
  Reset.MouseLeftButtonDown -= new
   MouseButtonEventHandler(Reset_MouseLeftButtonUp); 
  }
 }
}

参考文献

感谢您看到这里

希望您觉得这有用。我很高兴听到您的评论,保重 - Rajesh Lal。

© . All rights reserved.