Silverlight - 应用程序、资源和部署

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

加载插件

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

正如您所见,我们在 object 标记中使用 param 标记来指向内容。

  • HTML <Object> tag

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

<Object> in HTML

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

Type 类型属性

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

如果安装了 Silverlight 插件,则会加载它。 如果没有,标准格式行为是浏览器呈现 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>

Data 数据属性

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

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

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

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

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

<param> Tags

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

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

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

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

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

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

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

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

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

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

您可以编写 JavaScript 代码来解决问题,也可以直接要求插件尝试为您升级。

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

后备 HTML 内容

在 param 标记之后,是未安装 Silverlight 时要使用的后备 HTML 内容

对于 MIME 类型未知的对象标记,浏览器的标准行为是表现得好像对象和参数标记根本不存在一样。 因此,这个标签及其内容将在没有 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代码中,你可以看到两个矩形都有StaticResourcebrushResource的颜色是AliceBlue

编译并执行上述代码后,您将看到以下输出。

XAML 资源

App.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>

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("
", @"
");  
         System.Windows.Browser.HtmlPage.Window.Eval("throw new Error
            (\"Unhandled Error in Silverlight Application " + errorMsg + "\");"); 
      } catch (Exception) {} 
   } 
} 

注意事项

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

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

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

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