应用程序、资源和部署

应用程序、资源和部署


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

加载插件

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

如您所见,我们object标签中使用了param标签来指向内容。

  • HTML <Object> 标签

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

HTML 中的 <对象>

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

类型属性

type 属性包含将其标识为 Silverlight 元素的 MIME 类型。这就是浏览器如何知道我们正在使用什么样的嵌入内容。object 标签非常灵活。它不仅适用于插件。您可以使用它来托管嵌入的图像或 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>

数据属性

下一个属性,数据,不太明显。末尾的逗号意味着在那里。一些重要的功能是 –

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

  • 对象的标签被设计为主机嵌入的内容,这样浏览器就想到一个二进制字符串参与,位图文件或视频或音频流,或者什么的。

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

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

<param> 标签

我们在对象中有各种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 内容

如果未安装 Silverlight,则在 param 标记之后是要使用回退 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 资源

应用程序.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事件。

  • 在这里我们创建用户界面。我们希望在启动事件中创建一个用户界面元素并将其分配给应用程序对象的 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 应用程序。

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

觉得文章有用?

点个广告表达一下你的爱意吧 !😁