2010-04-14 2 views
2

При размещении приложения Silverlight на веб-странице можно использовать параметр splashscreensource, чтобы указать простой элемент управления Silverlight 1.0 (xaml + javascript), который будет отображаться при загрузке реального файла xap , и который может получать уведомление о ходе загрузки через onSourceDownloadProgressChanged. Если файл xap находится в кеше, заставка не отображается (и если загрузка занимает 1 секунду, заставка будет отображаться только в течение 1 секунды).Добавление минимального времени отображения экрана всплеска Silverlight

Я знаю, что это не лучшая практика в целом, но я ищу способ указать минимальное время отображения заставки - даже если xap-кеширование или загрузка быстрая, заставка останется по крайней мере, скажем, 5 секунд (например, для показа обязательного правового отказа, знака фирменного стиля или другой ошибки).

  • Я хочу сделать это в заставках исключительно (а затем в главном XAP), как я хочу, чтобы быть чистым и uninterupted (например, звук ошибка) и показывается пользователю, как только они открывают страницу, а не после загрузки (которая может занимать от 1 до 20 секунд).

  • Я бы предпочел не выполнять это с предварительной загрузкой - заменив заставку полным приложением Silverlight xap (с собственным экраном загрузки), которое затем программируется и отображает полный xap после минимального времени ожидания.

+0

Приятно было иметь возможность иметь полный контроль над закрытием заставки и запуском основного приложения. Это позволит отображать кнопку «skip» после загрузки xap или для экрана всплеска, который остается до тех пор, пока пользователь не закроет его. – David

ответ

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 framework добавляет по крайней мере 66 КБ к размеру вашего Xap, поэтому используйте его, вы уже используете Reactive stuff для других вещей.

+0

Я должен проверить, возможно ли, чтобы оба взаимодействовали с Javascript. Если это так, я вижу, что заставка запустила флаг «done» в Javascript, когда он готов к закрытию, и запуск приложения проверяет этот флаг каждые 250 мс до тех пор, пока он не будет установлен или не будет достигнут некоторый тайм-аут. – David

+0

@ Давид: дайте нам знать, как эта проверка работает, мне также будет интересно узнать, может ли приложение получить доступ к javascript, пока экран всплеска все еще действует. – AnthonyWJones

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"; 
}