在 Silverlight 托管 API 中,客户端要求在实例化应用程序之前将在清单中引用的程序集下载并加载到应用程序的 AppDomain 中。此外,您的应用程序设计可能要预加载某些资源并且确保这些资源在应用程序可供交互前可用,即使这意味着在下载完成前不显示该应用程序。初始屏幕是一个初始的内容区域,可在其他内容仍在加载时向用户显示。
本主题包括下列各节。
初始屏幕使用情况
可用于构造 Silverlight 初始屏幕的功能集旨在处理以下情况,但并不仅限于这些方面:
显示下载进度
显示动画,即使不必使用它们来显示下载进度
提供品牌,这可以包括文本、向量图形甚至视频
显示产品信息,例如免责声明
在本主题的相关节中将进一步论述这些使用情况。一般而言,可用的功能集与可用于 Silverlight 的 JavaScript API 的功能集相同,并且还有一些专门支持初始屏幕功能的特定 API。
如果您的主要源内容也在使用 JavaScript API,则您将无法高效地使用此初始屏幕模型。这是因为初始屏幕模型依赖于来自加载的托管 AppDomain 的通知,该通知用作停止显示 SplashScreenSource 和开始显示 Source 的信号。您可以通过以下序列模拟相同的明显转换行为:
加载作为"初始屏幕"的初始 Source XAML 页。
使用 Downloader 开始下载主要源 XAML 页和任何初始资源,例如页面要求的图像或视频。
一旦每个 Downloader 为所有内容都引发 Completed 后,更改位于 HTML DOM 级别的实际 Source 值,这将卸载"初始屏幕"并加载您的主要内容。这一转换在此时是瞬时的,因为所需的每个元素都已预加载到浏览器缓存中。
JavaScript API
如果您已针对 Silverlight 1.0 进行了开发,则可能已对用于 Silverlight 的 JavaScript API 十分熟悉。如果您以前未针对 Silverlight 1.0 进行过开发,请参见 Silverlight 的 JavaScript API。JavaScript API 与针对 HTML DOM 的编程十分相似,并且实际上是在主机的脚本引擎中执行的,就像针对 DOM 的脚本一样,但 Silverlight API 扩展到在 XAML 页作为 Silverlight 插件的内容加载时创建的对象树中。这使您可以处理针对特定对象的事件,设置属性值,以及在运行时替换对象树的部分等。
默认初始屏幕体验
在托管 API 下为 Silverlight 定义的默认体验是:超出某一时间阈值(约为 0.5 秒)的任何加载都将在内容区域中显示基于 XAML 的动画。显示该默认动画和初始化序列的 XAML 被硬编码到 Silverlight 插件中。
为了替换默认初始屏幕,您为在 HTML 中定义 object 元素的 Silverlight 插件的 splashScreenSource 参数提供一个值。
应用程序项目中的基本初始屏幕
在 Silverlight 中对于初始屏幕的基本支持在 Silverlight 插件基本代码级别定义。这将向处于 ActiveX 或 NPAPI 控件模型(取决于特定的浏览器)中的浏览器宿主公开,并且一般通过实例化 Silverlight 插件的 object 元素向 HTML DOM 和 HTML 公开。
Silverlight 插件的以下 params 选项专门用于初始屏幕支持:
参数
说明
SplashScreenSource
设置为初始屏幕提供视觉效果的 XAML 页的 URI。此页在 JavaScript API 下作为初始 Silverlight 内容加载。
OnSourceDownloadProgressChanged
设置正在下载 Source 期间对以增量方式调用的事件处理程序的名称。
OnSourceDownloadComplete
设置在 Source 下载完成后立即调用的事件处理程序的名称。
如果您为 OnSourceDownloadProgressChanged 或 OnSourceDownloadComplete 指定了一个处理程序,则引用的函数必须在运行时可用于浏览器脚本引擎。通常,这是通过在单独的 JavaScript 文件中定义该函数实现的。然后,您为承载定义 object 元素的 Silverlight 插件的 HTML 页包括脚本。在以下参考主题中提供针对事件处理程序原型的文档:OnSourceDownloadProgressChanged、OnSourceDownloadComplete。
用于 SplashScreenSource 的 XAML 页应可从某一 Web 服务器获取。此 XAML 页提供给 Silverlight 客户端,就像提供图像或托管 XAP 包之类的其他内容一样。应该对您的 Web 服务器进行配置,以便 .xaml 扩展名和用于 XAML 的相应 MIME 类型允许作为提供的内容。
初始屏幕具有安全注意事项,因为它们涉及跨 API 模式的转换,以及 HTML 页内的 Silverlight 初始化。为使这些转换更安全,您必须从相同的域提供初始屏幕进程的所有三个元素(宿主 HTML 页、初始屏幕 XAML、在初始屏幕显示时正下载的 XAP 包)。您可以选择通过 HTTPS 提供这些元素,但如果您这样做了,则必须将所有元素都作为 HTTPS 提供。
初始屏幕源必须是 XAML 文件。将 XAP 指定为初始屏幕源无效并且将会生成一个错误。
在如何定义简单的 Silverlight 初始屏幕主题中介绍了定义和打包一个简单的 Silverlight 初始屏幕的基本过程。
初始屏幕使用情况详述
用于初始屏幕的一个常见情形就是显示可视进度指示器。对于许多用户而言,最基本和最熟悉的进度指示器是进度栏。典型的进度栏设计显示一个水平延伸的矩形区域,该区域最初显示为白色或空。在下载或操作正在进行时,这个空区域逐渐被更深颜色的栏填充,并且只要更深颜色的栏完全填充该矩形,进度即完成。有时候,这一视觉效果通过显示数字百分比的文本区域来实现。
在 Silverlight 初始屏幕模型中,确定下载进度的方法是通过从 OnSourceDownloadProgressChanged 处理程序的事件数据内读取 Progress 属性的值。
尽管进度栏在视觉外观上可能与动画类似,但通常不需要使用 Silverlight 动画 API 来生成进度栏。您只需通过在 OnSourceDownloadProgressChanged 的每次迭代时使用 Progress 的某个因子来更新某个属性。
例如,以下 XAML 定义此类进度栏的一个简单版本:
复制代码
为了生成可视进度,您通过在处理程序中设置 progressBarFill 的宽度,在每次迭代时重置填充栏的值。progress 是介于 0 和 1 之间的值,因此您将其用作相对于进度栏区域的可能总宽度的因子。
复制代码
function onProgressChanged(sender, eventArgs) { var slPlugin = sender.getHost(); slPlugin.content.findName("progressBarFill").width = eventArgs.progress * 300; }
动画不是必需的,因为 Silverlight 呈现系统会检测到对象树中运行时更改的属性值并相应重绘视觉效果。
用于初始屏幕的另一个常见情形就是显示循环动画。循环动画用于向用户指示应用程序和浏览器仍在运行并且能够呈现更新,还指示未发生任何意外(浏览器崩溃、连接错误等)。
对于这些动画类型,总的动画持续时间是不确定的,因为其目的是为了在用户等待下载完成这一时间段中运行动画。因此,要使用的动画的最佳类型是具有自然循环行为并具有 Forever 运行时的动画。在整个 XAML 页被卸载后该动画将"停止",并且 Silverlight 插件将从下载完成包中加载内容。
通常可以完全在 XAML 中编写动画。若要运行动画,可以在 XAML 标记中使用 Storyboard 的 EventTrigger 包容,以便在首次加载动画时运行该动画。或者,您可以在 JavaScript API 下在根元素上处理 Loaded 之类的对象生存期事件,从某一 Resources 集合检索相关的 Storyboard,并且对 Storyboard 调用 Storyboard..::.Begin 以开始动画。
有关如何编写动画以及动画的一般工作方式的更多信息,请参见动画概述。请注意,动画概述主题主要是为托管 API 的用户编写的,可能没有适合 JavaScript API 情形的代码示例或特定信息。请阅读这一概述来加深概念上的理解。在概述中提供的某些 XAML 示例可能很有用,只需执行少量工作(例如删除 x:Class 之类的托管 API 细节)便可以利用这些示例。然后,您可以根据需要从 Silverlight 的 JavaScript API 参考的以下主题中了解更多信息:
ColorAnimation
DoubleAnimation
PointAnimation
Storyboard
资源
EventTrigger
您还可以通过将非线性内插用于位置和速度,使用关键帧动画来用于更精细微调的动画。它们可用于初始屏幕中非常简单的物理模拟,例如回力球。有关更多信息,请参见关键帧动画。就强调 XAML 示例的托管编程和可能的应用而言,适用同样的条件。另请参见 Silverlight 的 JavaScript API 参考中的下列主题:
ColorAnimationUsingKeyFrames
DoubleAnimationUsingKeyFrames
PointAnimationUsingKeyFrames
KeySpline
在许多应用程序模型中,传统的初始屏幕只显示单个较大的位图,并且可能显示进度指示器作为用户界面的较小部分。此类初始屏幕的一般目标是突出显示产品品牌信息。没有什么可以妨碍您为 Silverlight 初始屏幕采用此方法。在最简单的层级上,您的初始屏幕 XAML 可以只由显示位图的单个 Image 元素构成。不过,这可能不是理想方法;因为如果位图较大,图像源将以异步方式下载,所以您的初始屏幕在显示前可能会稍微延迟。
充分利用 Silverlight 的强大功能的一个更好方法是将您的初始屏幕编写为矢量图形。您可以使用在路径标记语法主题中描述的路径在某些情况下导入现有矢量信息。或者,您可以使用生成与 Silverlight 兼容的 XAML 标记的设计工具,例如 Microsoft Expression Design。此外,您可以集成由此类工具在设计时生成的任何动画,或者通过将固定矢量图形集的某些属性作为目标并使用演示图板对它们进行动画处理,在以后将动画添加到图形。
您的初始屏幕可能要显示主要包含文本的区域。为了简化本地化,您可能要将文本保持在内容的矢量图形部分之外。JavaScript API 不像托管 API 那样具有成熟的本地化框架,但即便如此,它仍可用于在整个标记中将本地化需求隔离到某些控件。
在您为某一初始屏幕显示文本时,将被限制在可用于 JavaScript API 的文本元素上。对于只读文本有两种可能的技术:TextBlock 或 标志符号。
TextBlock 可能是更轻量级的技术,特别是在您只是针对拉丁字母区域性时。您将 TextBlock 内容指定为一个字符串。在 TextBlock 内,您可以进行一些基本的文本格式设置,例如调整大小、应用颜色或画笔以及使用 LineBreak 进行块级格式设置。如果您想要使用在 TextBlock 中描述的默认字体之外的其他字体,则必须下载该字体;请参见 SetFontSource。
标志符号 是更通用的技术,因为您可以提供划分了子集的字体以及 UnicodeString,这便于使用远东字体和字符串。唯一的复杂因素就是您需要可生成划分了子集的字体和兼容的 Unicode 索引/字符串的工具。在 标志符号 中描述了使用来自 Microsoft Word 的 XPS 输出的技术。
使用 OnSourceDownloadComplete
引发 OnSourceDownloadComplete 之时也就是初始屏幕 XAML 被卸载之时,此时准备加载包。因此,执行影响 Silverlight 对象树的任何操作通常并无意义。而是可使用 OnSourceDownloadComplete 作为提示来在周围 HTML 中更新用户界面,或者可以更改您在 Silverlight 内容区域之上呈现的任何 HTML 重叠(如果您使用该技术)。
请参见
应用程序和编程模型
Silverlight 的 JavaScript API
Silverlight 的 JavaScript API 参考
Silverlight 插件对象参考