在浏览器外运行我们的 Silverlight 3 应用程序时,启动需要一点时间,但时间足够长,足以引起注意。在此启动期间,托管应用程序的窗口的背景显示为难看的白色背景颜色。在浏览器中运行时,我们有一个启动画面,但它当然是通过 JavaScript 加载的。我怎样才能使启动画面适用于浏览器外的 Silverlight 3?或者如果这不可能,有没有办法至少可以改变窗口的背景颜色?
2 回答
我实际上找到了一种方法来做到这一点。万岁!很多功劳归功于此页面上的文档。请注意,我们正在磁盘上分发我们的应用程序;这些说明不适用于用户从 Web 安装的 Silverlight 应用程序。
事实证明,Silverlight 启动器在开始时会加载一个 HTML 页面。在安装应用程序的地方,有一个 index.html 文件。该页面包含一个<object>
类似于用于在 Web 上托管 Silverlight 的标签。
不幸<object>
的是,这不支持 Silverlight 启动屏幕 XAML 或进度指示器,我猜这是可以预料的,因为 XAP 没有被下载。此外,设置页面或页面的背景颜色<object>
似乎也没有生效。然而,事实证明,只是 Windows 立即开始绘制插件,因此在这样做时会显示默认的窗口颜色。
为了解决这个问题,我将visibility
托管<div>
Silverlight 的 设置为hidden
. 然后,在 HTML 的底部,我添加了一个<script>
设置计时器。当计时器触发时, 的visibility
更改<div>
为visible
,并且 Silverlight 对象获得焦点。即使计时器设置为 1 毫秒,这也让 HTML 的主机有机会进行网页的初始绘制。这允许显示 Silverlight 下的任何内容。
这是我的整个 HTML 页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<style type="text/css">
html, body { height: 100%; overflow: hidden; background-color: black; }
body { padding: 0; margin: 0; }
#silverlightControlHost
{
height: 100%; visibility: hidden; position: absolute;
}
#splashScreen
{
background-image: url('blah.png');
background-repeat: no-repeat;
width: 575px;
height: 330px;
top: 185px;
left: 212px;
color: white;
position: absolute;
font-family: Arial, Sans-Serif;
}
#loadingText
{
position: relative;
top: 165px;
text-align: center;
font-size: 18px;
}
</style>
</head>
<body scroll="no">
<div id="silverlightControlHost">
<object id='_sl' data="data:application/x-silverlight," type="application/x-silverlight" width="100%" height="100%">
<param name="source" value="offline://1931574666.localhost"/>
<param name="background" value="Black"/>
<param name="enableGPUAcceleration" value="True"/>
<a href="http://go.microsoft.com/fwlink/?LinkID=124807"
style="text-decoration: none;">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181"
alt="Get Microsoft Silverlight" style="border-style: none"/>
</a>
</object>
<iframe style='visibility:hidden;height:0;width:0;border:0px'></iframe>
</div>
<div id="splashScreen">
<div id="loadingText">Loading. Please wait...</div>
</div>
<script>
setTimeout(
function() {
var ctrl = document.getElementById("silverlightControlHost");
ctrl.style.visibility = "visible";
document.getElementById('_sl').focus();
},
3000
);
</script>
</body>
</html>
不幸的是,Silerlight 3 没有提供自定义方法。