为Silverlight初始屏幕添加最短显示时间

时间:2010-04-14 16:41:46

标签: silverlight silverlight-3.0 splash-screen

在网页上托管silverlight应用程序时,可以使用splashscreensource参数指定在下载真实xap文件时显示的简单Silverlight 1.0(xaml + javascript)控件,并且可以接收通过onSourceDownloadProgressChanged通知下载进度。如果xap文件位于缓存中,则不显示启动屏幕(如果下载仅需1秒,则启动屏幕将仅显示1秒钟。)

我知道这不是一般的最佳做法,但我正在寻找一种方法来指定启动画面的最短显示时间 - 即使缓存的xap或下载速度很快,启动屏幕也会保持不变至少,比方说,5秒(例如显示所需的法律免责声明,公司标识或其他错误)。

  • 我确实想在启动画面中独占(而不是在主xap中),因为我希望它是干净且不间断的(例如声音错误),并且只要它们显示给用户打开页面,而不是下载后(可能需要1到20秒以上)。

  • 我不希望通过预加载来实现这一点 - 用完整的Silverlight xap应用程序替换启动屏幕(使用它自己的加载屏幕),然后可编程加载并在最短的等待时间后显示完整的xap。

2 个答案:

答案 0 :(得分:2)

一个鲜为人知的事实是,除了XAP加载的时间之外,启动画面仍然存在。在应用程序RootVisual加载之前,它不会被替换。因此,如果您未在应用程序RootVisual事件中分配Startup,则会始终显示初始屏幕。

因此,您可以使用以下代码延迟启动画面几秒钟: -

private void Application_Startup(object sender, StartupEventArgs e)
{
    var timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromSeconds(10);
    EventHandler eh = null;

    eh = (s, args) =>
    {
        timer.Stop();
        this.RootVisual = new Test();
        timer.Tick -= eh;
    };

    timer.Tick += eh;

    timer.Start();
}

这可以通过Reactive框架进行简化: -

private void Application_Startup(object sender, StartupEventArgs e)
{
    Observable.Timer(TimeSpan.FromSeconds(10), Scheduler.Dispatcher)
        .Subscribe((l) =>
    {
        this.RootVisual = new Test();
    });
}

但是,Reactive框架至少会增加66KB的Xap大小,所以只使用它已经将Reactive的东西用于其他东西。

答案 1 :(得分:0)

请注意,如果您只对在开发期间延长启动画面的显示时间感兴趣,那么添加Fiddler规则非常简单,该规则会延迟Xap文件的响应。

这是具有此效果的规则的示例。有关如何应用规则的详细信息,请参阅Pedro Forte's post - 这非常简单!

if (oSession.uriContains("Midwinter.ReasonableBasis.Client.xap")){
    oSession["ui-color"]="orange"; 
    oSession["ui-bold"]="true";
    //Delay received data by X ms per KB downloaded.
    oSession["response-trickle-delay"] = "10"; 
}