应用程序、资源和部署


在本章中,我们将讨论有关创建和部署应用程序及其所需资源的常见问题。

加载插件

运行 Silverlight 应用程序的最低要求是托管包含用于加载 Silverlight 插件的对象标记的网页,以及编译的 Silverlight 内容本身。

正如您所看到的,我们在对象标签中使用了param标签来指向内容。

  • HTML <对象> 标签

我们还可以传递其他参数来控制功能,例如下载内容时显示的用户界面、出现错误时运行的 JavaScript 代码以及未安装 Silverlight 时显示的后备内容。

HTML 中的 <对象>

下面是一个加载一些 Silverlight 内容的示例对象标记。您之前已经看到过这一点,但我们将更详细地了解一些内容,从对象标签本身的属性开始。

类型属性

type 属性包含将其标识为 Silverlight 元素的 MIME 类型。这就是浏览器知道我们正在使用哪种嵌入内容的方式。对象标签非常灵活。它不仅仅适用于插件。您可以使用它来托管嵌入式图像或 HTML,以及基于插件的内容,例如 Silverlight 或 Flash。

如果安装了 Silverlight 插件,则会加载它。如果没有,标准格式Behave是浏览器呈现 object 标记内的任何 HTML 内容,就好像 object 和 param 标记不存在一样。

<object data = "data:application/x-silverlight-2," type =  "application/x-silverlight-2"  
   width = "100%" height = "100%"> 
	
   <param name = "source" value = "ClientBin/DataBinding.xap"/> 
   <param name = "onError" value = "onSilverlightError" /> 
   <param name = "background" value = "white" /> 
   <param name = "minRuntimeVersion" value = "5.0.61118.0" /> 
   <param name = "autoUpgrade" value = "true" />
	
   <a href = "http://go.microsoft.com/fwlink/?LinkID=149156&v=5.0.61118.0" 
      style = "textdecoration:none"> 
		
      <img src = "http://go.microsoft.com/fwlink/?LinkId=161376" 
         alt = "Get Microsoft Silverlight" style = "border-style:none"/> 
   </a> 
	
</object>

数据属性

下一个属性,数据,不太明显。末尾的逗号是应该存在的。一些重要的功能是 -

  • 此属性在技术上不是必需的,但 Microsoft 建议您添加它,因为某些 Web 浏览器在加载插件时会出现相当令人惊讶的Behave。

  • 对象标记旨在托管嵌入内容,因此浏览器期望涉及二进制字符串、位图文件、视频、音频流或其他内容。

  • 您通常希望在数据属性中放置一个 URL,然后浏览器下载该数据并将其传递给插件。

  • data 属性采用 URI,通常它会指向某些数据,例如 JPEG 文件,但在这里,我们使用了稍微不寻常的 URI 方案。

<参数> 标签

我们在对象内部有各种param标签,从源param开始。

<param name = "source" value = "ClientBin/DataBinding.xap"/>

它为插件提供了下载 Silverlight 内容的位置。

您应该提供一个 JavaScript 错误处理程序。如果下载过程失败,将调用此函数。一旦 Silverlight 代码启动并运行,如果抛出未处理的异常,它也会被调用。

<param name = "onError" value = "onSilverlightError" />

所以这不仅仅是针对加载失败。您还应该指定代码所需的 Silverlight 最低版本。

Microsoft 鼓励用户保持最新状态,因此一旦计算机安装了 Silverlight 插件,就会通过 Windows 更新提供新版本,但用户始终有可能运行比您需要的版本更旧的版本。

<param name = "minRuntimeVersion" value = "5.0.61118.0" /> 
<param name = "autoUpgrade" value = "true" /> 

这个minRuntimeVersion参数让您可以说出您需要哪个版本。如果安装的版本较旧,则会调用 onError 处理程序。

Silverlight 将数字错误代码传递给错误处理 JavaScript 函数,并且有一个明显的错误代码“ 8001 ”,表明该插件已过期。

您可以编写 JavaScript 代码来响应问题,也可以仅要求插件尝试为您升级。

这里,autoUpgrade参数设置为“ True ”,这意味着如果安装的插件已过期,Silverlight 将自动显示一条消息,告诉用户需要更新的版本,并主动为他们安装。

后备 HTML 内容

param 标记后面是未安装 Silverlight 时要使用的后备 HTML 内容。

MIME类型未知的对象标记的标准浏览器Behave是表现得好像对象和参数标记根本不存在一样。因此,这个标签及其内容将在没有 Silverlight 插件的系统中显示。

<a href = "http://go.microsoft.com/fwlink/?LinkID=149156&v=5.0.61118.0"  
   style = "text-decoration:none"> 
   <img src = "http://go.microsoft.com/fwlink/?LinkId=161376"  
      alt = "Get Microsoft Silverlight" style = "border-style:none"/> 
</a>

请注意go.microsoft.com站点的两个 URL 、一个超链接和一个图像。

图像链接解析为带有一些 Silverlight 品牌的位图,以及一些提供安装 Silverlight 的文本。超链接的端点是中等智能的。服务器检查用户代理来决定重定向到哪里。

它可能会返回 Silverlight 安装可执行文件,或者如果用户位于不受支持的平台上,它会将浏览器定向到包含有关 Silverlight 信息的页面。

Silverlight.js

除了 HTML 对象标记之外,还有一种用于加载 Silverlight 内容的替代方法。Microsoft 提供了一个名为Silverlight.js的 JavaScript 文件,允许通过浏览器脚本管理加载过程。

当您创建 Web 项目来托管新创建的 Silverlight 项目时,Visual Studio 会添加一个副本。Silverlight SDK 还包含此文件的副本。

Silverlight.js的主要优点是在未安装 Silverlight 时提供更大的灵活性。

XAML 资源

Silverlight 还提供了一种在 XAML 中创建对象资源的机制。您可能希望能够在应用程序的多个位置使用通常通过 XAML 更正的某些类型的对象。想要在多个地方使用模板是很常见的。

如果您已经为按钮定义了自定义外观,您可能希望将其应用于多个按钮,甚至应用程序中的所有按钮。XAML 资源系统提供了一种方法来执行此操作。您可以定义命名资源,然后在 XAML 中的其他位置使用它。

除了模板之外,对图形资源(例如画笔和形状)执行此操作也很常见。如果您的应用程序中使用了特定的配色方案,您可以将该方案的颜色和画笔定义为资源。

这是SolidColorBrush资源的简单应用程序。

<UserControl x:Class = "XAMLResources.MainPage" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   mc:Ignorable = "d" 
   d:DesignHeight = "300" d:DesignWidth = "400">
   
   <UserControl.Resources> 
      <SolidColorBrush x:Key = "brushResource" Color = "AliceBlue" /> 
   </UserControl.Resources> 
	
   <Grid x:Name = "LayoutRoot" Background = "White"> 
      <StackPanel> 
         <Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}" /> 
         <Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}"/> 
      </StackPanel> 
   </Grid> 
	
</UserControl>

在上面的 XAML 代码中,您可以看到两个矩形都有StaticResource ,brushResource的颜色为AliceBlue

当上面的代码被编译并执行时,您将看到以下输出。

XAML 资源

应用程序.xaml

所有 Silverlight 应用程序都有一个名为App.xaml的文件。它包含应用程序范围的信息。例如,它有一个 Resources 属性,就像用户界面元素一样。

您在App.xaml文件中定义的资源可在项目中的所有 XAML 文件中使用。因此,我们可以将它们移至应用程序范围,而不是用这些类型的资源弄乱我的MainPage.xaml 。

<Application 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"  
   x:Class = "XAMLResources.App" > 
	
   <Application.Resources> 
      <SolidColorBrush x:Key = "brushResource" Color = "AliceBlue" /> 
   </Application.Resources>
	
</Application>

应用类

与大多数 XAML 文件一样,App.xaml文件及其相应的代码隐藏文件定义一个类。该Application 类是Silverlight 应用程序的入口点。App.xaml通常处理应用程序范围资源它的代码隐藏文件包含启动和关闭处理代码。

  • 创建 Application 类的实例后不久,Silverlight 就会引发其Application.Startup事件。

  • 在这里我们创建用户界面。我们希望创建一个用户界面元素,并将其分配给Startup事件中的应用程序对象 RootVisual 属性,这将成为 Silverlight 插件显示的用户界面。

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 MainPage(); 
   } 
	
   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(e); }); 
      } 
		
   }  
	
   private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e) { 
      try { 
         string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace; 
         errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");  
         System.Windows.Browser.HtmlPage.Window.Eval("throw new Error
            (\"Unhandled Error in Silverlight Application " + errorMsg + "\");"); 
      } catch (Exception) {} 
   } 
} 

注意事项

请注意,您无法更改RootVisual。您必须准确设置一次。如果您想在应用程序运行时更改用户界面,则必须通过更改MainPage的内容来实现,而不是尝试用其他页面替换MainPage 。

其他应用程序事件是Exit ,这是当用户界面即将消失时运行关闭代码的最后一刻机会,以及UnhandledException,如果您的代码抛出未处理的异常,则会引发该事件。

如果您没有为UnhandledException事件提供处理程序,或者该处理程序没有将该事件标记为正在处理,则UnhandledExceptions将有效地关闭您的 Silverlight 应用程序。

屏幕上的插件区域将变为空白,并且将向浏览器报告脚本错误。