在本章中,我们将讨论有关创建和部署应用程序及其所需资源的常见问题.
运行Silverlight应用程序的最低要求是托管包含加载Silverlight插件的对象标记的网页,以及编译后的Silverlight内容.
如您所见,我们使用 object 标记中的 param 标记指向内容.
HTML< Object>标签
我们可以传入其他参数来控制功能,例如在内容中显示的用户界面下载,在发生错误时运行的JavaScript代码,以及在未安装Silverlight时显示的后备内容.
这是一个加载一些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 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将自动显示一条消息,告知用户需要更新版本,并为其安装.
在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的信息.
可以使用HTML对象标记替代加载Silverlight内容. Microsoft提供了一个名为 Silverlight.js 的JavaScript文件,允许从浏览器脚本管理加载过程.
Visual Studio在创建Web时添加副本用于托管新创建的Silverlight项目的项目. Silverlight SDK还包含此文件的副本.
Silverlight.js 的主要好处是它可以在未安装Silverlight时提供更大的灵活性.
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 .
编译并执行上述代码时,您将看到以下输出.
所有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区域将变为空白,并且将向浏览器报告脚本错误.