【问题标题】:Adding a minimum display time for Silverlight splash screen添加 Silverlight 闪屏的最短显示时间
【发布时间】:2010-04-14 16:41:46
【问题描述】:

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

我知道这通常不是最佳实践,但我正在寻找一种方法来指定启动屏幕的最短显示时间 - 即使 xap 缓存或下载速度很快,启动屏幕也会保持在至少,假设是 5 秒(例如显示所需的法律免责声明、企业身份标记或其他错误)。

  • 我确实希望只在启动屏幕中执行此操作(而不是在主 xap 中),因为我希望它干净且不受干扰(例如声音错误)并在用户看到后立即显示给用户打开页面,而不是在下载之后(可能需要 1 到 20 多秒)。

  • 我不希望通过预加载来完成此操作 - 用完整的 Silverlight xap 应用程序(带有它自己的加载屏幕)替换初始屏幕,然后在最短等待时间后以可编程方式加载并显示完整的 xap。

【问题讨论】:

  • 一个不错的选择是能够全面控制启动屏幕何时关闭和主应用程序运行。这将允许在下载 xap 后显示“跳过”按钮,或者在用户单击它之前保持启动画面。

标签: silverlight silverlight-3.0 splash-screen


【解决方案1】:

这是一个鲜为人知的事实,即启动画面在 XAP 加载时间之后仍然存在。在应用程序 RootVisual 加载之前,它不会被替换。因此,如果您没有在应用程序Startup 事件中分配RootVisual,则启动画面将永远显示。

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

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 框架为 Xap 的大小增加了至少 66KB,所以只使用它你已经将 Reactive 的东西用于其他事情了。

【讨论】:

  • 我必须检查两者是否可以与 Javascript 交互。如果是这种情况,当它准备好关闭时,我可以看到启动屏幕在 Javascript 中设置一个“完成”标志,并且应用程序启动每 250 毫秒检查一次该标志,直到它被设置或达到某个超时。
  • @David:让我们知道检查结果如何,我也很好奇应用程序是否可以在启动画面仍然有效时访问 javascript。
【解决方案2】:

请注意,如果您只对在开发过程中延长启动画面的显示时间感兴趣,那么添加一个 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"; 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多