应用程序,资源和部署

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

加载插件

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

如您所见,我们使用 object 标记中的 param 标记指向内容.

  • HTML< Object>标签

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

< Object>在HTML中

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

类型属性

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

如果安装了Silverlight插件,会加载它.如果没有,标准格式行为是浏览器在对象标记内呈现任何HTML内容,就好像对象和参数标签不存在一样.

<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浏览器具有加载插件时出现相当令人惊讶的行为.

  • 对象标记旨在托管嵌入内容,因此浏览器需要二进制字符串参与,位图文件,视频或音频流等.

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

  • 数据属性采用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代码来回应问题,或者您可以直接询问插件-in尝试升级.

这里, 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 网站的两个网址,超链接和图片.

图像链接解析为具有一些Silverlight品牌的位图,以及一些用于安装Silverlight的文本.超链接的端点是中等智能的.服务器检查用户代理以决定重定向的位置.

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

Silverlight.js

可以使用HTML对象标记替代加载Silverlight内容. Microsoft提供了一个名为 Silverlight.js 的JavaScript文件,允许从浏览器脚本管理加载过程.

Visual Studio在创建Web时添加副本用于托管新创建的Silverlight项目的项目. Silverlight SDK还包含此文件的副本.

Silverlight.js 的主要好处是它可以在未安装Silverlight时提供更大的灵活性.

XAML资源

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

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

除了模板之外,通常也希望对图形资源执行此操作,如刷子和形状.如果在应用程序中使用了特定的颜色方案,则可以将该方案的颜色和画笔定义为资源.

这是 SolidColorBrush的简单应用程序 resource.

<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 Resources

App.xaml

所有Silverlight应用程序都有一个名为

您在 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 有一个不同的.

其他应用程序事件是退出,这是你运行

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

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