📅  最后修改于: 2020-11-19 08:36:25             🧑  作者: Mango
在本章中,我们将研究有关创建和部署应用程序以及所需资源的常见问题。
运行Silverlight应用程序的最低要求是托管网页,该网页包含一个用于加载Silverlight插件的对象标签以及已编译的Silverlight内容本身。
如您所见,我们在object标签中使用了param标签来指向内容。
HTML
我们还可以传递其他参数来控制功能,例如在下载内容时显示的用户界面,在发生错误时运行的JavaScript代码以及在未安装Silverlight时显示的后备内容。
这是一个示例对象标签,它加载了一些Silverlight内容。您之前已经看过这一点,但是我们将更详细地看一些事情,从object标签本身的属性开始。
type属性包含一个MIME类型,将该类型标识为Silverlight元素。这就是浏览器知道我们正在使用哪种嵌入式内容的方式。对象标签非常灵活。它不仅适用于插件。您可以使用它来托管嵌入式图像或HTML,以及基于插件的内容,例如Silverlight或Flash。
如果安装了Silverlight插件,则会加载它。如果不是,则标准格式行为是使浏览器呈现对象标记内的任何HTML内容,就好像对象标记和参数标记不存在一样。
下一个属性data不太明显。末尾的逗号注定会出现。一些重要的功能是-
从技术上来说,此属性不是必需的,但Microsoft建议您添加它,因为某些Web浏览器在加载插件时会有相当令人惊讶的行为。
object标签旨在承载嵌入式内容,因此浏览器希望包含二进制字符串,位图文件或视频,音频流或其他内容。
通常,您通常希望在data属性中放置一个URL,然后由浏览器下载该数据,并将其传递给插件。
data属性带有一个URI,通常它将指向某些数据,例如JPEG文件,但是在这里,我们使用的是一个稍微不寻常的URI方案。
从源param开始,对象内部有各种param标签。
它提供了从何处下载Silverlight内容的插件。
您应该提供一个JavaScript错误处理程序。如果下载过程失败,将调用此方法。一旦Silverlight代码启动并运行,如果引发了未处理的异常,也将调用该方法。
因此,这不仅是针对负载故障。您还应该指定代码所需的最低Silverlight版本。
Microsoft鼓励用户保持最新状态,因此,一旦计算机上安装了Silverlight插件,就会通过Windows更新提供新版本,但是用户始终有可能运行的版本比您要求的版本更早。 。
使用此minRuntimeVersion参数可以说出所需的版本。如果安装的版本较旧,则将调用onError处理程序。
Silverlight将数字错误代码传递给错误处理JavaScript函数,并且出现一个明显的错误代码“ 8001 ”,以指示该插件已过期。
您可以编写JavaScript代码来响应该问题,也可以只要求插件为您尝试升级。
在这里, autoUpgrade参数设置为’ True ‘,这意味着,如果安装的插件已过期,Silverlight将自动显示一条消息,告诉用户需要更新的版本,并为他们安装。
如果未安装Silverlight,则将在param标记之后,使用要使用的后备HTML内容。
MIME类型未知的对象标签的标准浏览器行为是好像根本没有对象和param标签一样。因此,该标签及其内容将在没有Silverlight插件的系统中显示。
请注意go.microsoft.com网站的两个URL,一个超链接和一个图像。
图像链接解析为带有某些Silverlight品牌和一些提供安装Silverlight的文本的位图。超链接的端点是中等智能的。服务器检查用户代理以确定重定向到的位置。
它可能会提供Silverlight Install可执行文件,或者如果用户使用不受支持的平台,它将把浏览器定向到包含有关Silverlight信息的页面。
除了HTML对象标签以外,还可以使用其他方法来加载Silverlight内容。 Microsoft提供了一个名为Silverlight.js的JavaScript文件,该文件允许从浏览器脚本管理加载过程。
当您创建一个Web项目来承载一个新创建的Silverlight项目时,Visual Studio将添加一个副本。 Silverlight SDK也包含此文件的副本。
Silverlight.js的主要优点是,在未安装Silverlight的情况下,它具有更大的灵活性。
Silverlight还提供了一种在XAML中创建对象资源的机制。通常可以通过XAML纠正某些类型的对象,您可能希望能够在应用程序的多个位置使用它们。想要在多个地方使用模板是很常见的。
如果为按钮定义了自定义外观,则可能需要将其应用于多个按钮,甚至可能应用到应用程序中的所有按钮。 XAML资源系统提供了一种方法。您可以定义一个命名资源,然后在XAML中的其他地方使用它。
除了模板之外,通常还希望对图形资源(例如画笔和形状)执行此操作。如果在应用程序中使用了特定的配色方案,则可以将该方案的颜色和画笔定义为资源。
这是SolidColorBrush资源的简单应用程序。
在上面的XAML代码,你可以看到,这两个矩形具有静态资源brushResource的颜色是艾莉斯蓝。
编译并执行上述代码后,您将看到以下输出。
所有Silverlight应用程序都有一个名为App.xaml的文件。它包含应用程序范围的信息。例如,它具有资源属性,就像用户界面元素一样。
您在App.xaml文件中定义的资源可用于项目中的所有XAML文件。因此,我们可以将它们移到应用程序范围内,而不是使我的MainPage.xaml变得混乱不堪。
像大多数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应用程序。
屏幕上的插件区域将变为空白,并且脚本错误将报告给浏览器。