技术开发 频道

使用 ASP.NET 控件封装 Silverlight


  封装 Silverlight 的任务从创建新自定义 ASP.NET 控件开始:
namespace MsdnMagazine { public class SilverlightSphere : Control { } }
  在本例中,我从 System.Web.UI.Control 派生。我选择不从 WebControl 派生是因为该类定义的其他样式属性不适合此控件。

  接着,需要呈现手动包含的 JavaScript 处理程序。在 ASP.NET 控件中集成 JavaScript 的最简单方法是,先定义一个 JavaScript 文件,然后将其作为资源嵌入编译好的程序集中。将两个事件处理程序放在单独的 JavaScript 文件(称为 SilverlightSphere.js)中可以实现这一点:
// File: SilverlightSphere.js function onSphereButtonDown(sender, args) { // Same implementation as before } function onTextLoaded(sender, args) { // Same implementation as before }
  接着,将新 SilverlightSphere.js 文件和原 Silverlight.js 文件作为资源嵌入控件项目。这使控件可以作为单个程序集部署,而没有任何依赖文件。您还可以将 XAML 文件作为资源嵌入,并使用 ASP.NET 中提取嵌入资源的 WebResource.axd 处理程序机制引用该文件和这两个 JavaScript 文件。

  在 Visual Studio® 中针对这三个文件将“生成操作”设置为“嵌入的资源”(命令行编译器的 /res)后,再使用程序集级属性 System.Web.UI.WebResource 授予这些资源的权限,以便得到 WebResource.axd 的支持并关联用于响应的 MIME 类型。使用下面的声明可实现这一点(其中 SlSphere 是控件项目的名称):
[assembly: WebResource("SlSphere.SilverlightSphere.js", "text/javascript")] [assembly: WebResource("SlSphere.Silverlight.js", "text/javascript")] [assembly: WebResource("SlSphere.Sphere.xaml", "text/xml")]
  现在,JavaScript 文件作为资源被编译成程序集。因此,现在可以使用 ClientScriptManager 类(通过 Page.ClientScriptManager 访问)的 RegisterClientScriptResource 方法使呈现的页包含这些文件的引用。在从 Control 基类继承的 OnInit 方法的重写方法中对每个文件调用此方法:
protected override void OnInit(EventArgs e) { Page.ClientScript.RegisterClientScriptResource(this.GetType(), "SlSphere.Silverlight.js"); Page.ClientScript.RegisterClientScriptResource(this.GetType(), "SlSphere.SilverlightSphere.js"); base.OnInit(e); }
  该控件最后且最重要的部分是实现虚拟 Render 方法。在此方法中必须完成两个任务。首先,需要呈现 <div> 标记以作为承载 Silverlight 插件的 HTML 元素。其次,必须呈现嵌入的脚本以创建 Silverlight 插件。

  调用 ClientScriptManager 类的 GetWebResourceUrl 方法可生成对 XAML 文件的引用。这可确保使用作为资源嵌入到程序集中的 XAML 文件的内容初始化 Silverlight 控件。最后,需要为 Silverlight 插件本身指定唯一的标识符。在本例中,使用控件的 ID (this.ClientID) 并连接“_ctrl”作为其标识符(请参见图 5)。

  现在即拥有一个服务器端控件(以及嵌入的 JavaScript 和 XAML 资源),该控件封装在 ASP.NET 页面上部署 Silverlight 所需的各部分。可以在页面上通过下列声明创建此控件的实例:
<%@ Register Assembly="SlSphere" Namespace="MsdnMagazine" TagPrefix="csc" %> ... <csc:SilverlightSphere ID="_silverlightSphere" runat="server" />
  现在我能达成颇为引人注目的成果——任何 ASP.NET 应用程序都可以轻松集成 Silverlight 中承载的变大变小球体,而无需考虑承载 Silverlight 内容的详细信息。

  当然,使用高级 XAML 呈现,可以生成更引人入胜的复杂控件。但是,当开始考虑可能要添加到控件的功能时,很快便会遇到如何使用服务器控件中的属性值处理 XAML 的问题。例如,假定要公开控件中的 Title 属性,并将其映射到 XAML 文件中 titleText 元素的 Text 属性。通过当前实现显然无法做到这一点。

  当前实现的另一个缺点是 XAML 被固定为嵌入的资源。尽管这种实现方式便于部署,但 Silverlight 和 XAML 将行为与设计分离的优点却使 XAML 可被替换。可以在控件上定义一个 XamlUrl 属性来重写嵌入的 XAML 内容。此方法实现起来不难,但会在 XAML 中公开 JavaScript 处理程序的名称时带来问题,这就要求设计者使用最新版 XAML。
0
相关文章