2012-12-01 39 views
4

我目前正在努力擴展初始屏幕添加到我的應用程序一旦完成後自動刪除自身下載一個RSS feed,並發現有效的高分辨率圖像之前完成該Feed可縮略圖縮略圖(首次啓動應用程序時,這可能需要5秒以上,使用戶屏幕空白)。Windows 8中:等待安裝任務拆除擴展啓動畫面

不幸的是,因爲他們通過按下一個按鈕,而不是等待各種嵌套函數來完成他們解僱了MSDN擴展啓動畫面例如一直沒有相當有幫助的。我發現的其他例子跳過了對應用程序編程相對較新的人沒有幫助的重要細節。

app.onactivated = function (args) { 
    if (args.detail.kind === activation.ActivationKind.launch) { 
     if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) { 
      // TODO: This application has been newly launched. Initialize 
      // your application here. 
     } else { 
      // TODO: This application has been reactivated from suspension. 
      // Restore application state here. 
     } 

     performSetupTasks(); 
     // Retrieve splash screen object. 
     var splash = args.detail.splashScreen; 
     // Display the extended splash screen. 
     displayExtendedSplash(splash); 

     args.setPromise(WinJS.UI.processAll().then(removeExtendedSplash()));    
    } 
}; 

而是,上面的代碼立即刪除擴展的啓動畫面;我是否需要添加任何代碼來報告返回performSetupTasks()不完整?

+0

你有沒有想過這個? – GotDibbs

+1

不幸的是,我沒有。我使用了一個佔位符window.setTimeout(或類似的東西),並已經放棄了該項目。幾個月前,當我下班回家時,我不得不查看源代碼)。但是,這是行不通的,因爲我想和使用閃屏收益率window.timeOut方法不可預知的和不一致的結果,並可能會失敗的認證。有一天,我想重新審視這個項目,因爲我現在有更多的經驗,可能從頭開始重建它。 – Arctic

+0

感謝您的回覆。我結束了下面這個教程,它似乎只是正常工作對我來說:http://blogs.msdn.com/b/windowsappdev/archive/2012/05/21/creating-a-fast-and-fluid-app- launch-experience.aspx – GotDibbs

回答

0

腳本暫停閃屏顯示移動到應用程序之前...

1)後「app.onactivated =函數(參數){ 如果(args.detail.kind === activation.ActivationKind。發射){「在default.js添加以下代碼

pauseDisplayOfSplashScreen(2500); 

2.)上述app.oncheckpoint =函數(參數)中,添加以下功能。

function pauseDisplayOfSplashScreen(milliseconds) { 
    milliseconds += new Date().getTime(); 
    while (new Date() < milliseconds) { } 
} 

因爲在這裏你清楚的瞭解是全面啓動畫面暫停工作default.js:

// For an introduction to the Blank template, see the following documentation: 
    // http://go.microsoft.com/fwlink/?LinkId=232509 
    (function() { 
    "use strict"; 

    WinJS.Binding.optimizeBindingReferences = true; 

     var app = WinJS.Application; 
     var activation = Windows.ApplicationModel.Activation; 

app.onactivated = function (args) { 
    if (args.detail.kind === activation.ActivationKind.launch) { 

     //pause for two seconds 
     pauseDisplayOfSplashScreen(2500); 

     if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) { 
      // TODO: This application has been newly launched. Initialize 
      // your application here. 
     } else { 
      // TODO: This application has been reactivated from suspension. 
      // Restore application state here. 
     } 
     args.setPromise(WinJS.UI.processAll()); 
    } 
}; 


function pauseDisplayOfSplashScreen(milliseconds) { 
    milliseconds += new Date().getTime(); 
    while (new Date() < milliseconds) { } 
} 
app.oncheckpoint = function (args) { 
    // TODO: This application is about to be suspended. Save any state 
    // that needs to persist across suspensions here. You might use the 
    // WinJS.Application.sessionState object, which is automatically 
    // saved and restored across suspension. If you need to complete an 
    // asynchronous operation before your application is suspended, call 
    // args.setPromise(). 


}; 

app.start(); 

})(); 

希望這將解決您的問題:)

+0

這並不回答我的問題。我不想暫停默認的啓動畫面,我想解僱我創建一個自定義擴展啓動畫面,這說明用戶負載信息和進度條,並自駁回所有負載是爲了顯示完整的後登陸頁面。 – Arctic

1

的問題是,你可能在您的performSetupTasks();方法中執行異步操作。

重構代碼返回這一承諾,使這一承諾得到滿足後,才啓動畫面將被刪除:

function removeExtendedSplash() { 
    var promise = WinJS.xhr(...); 
    promise.then(function(result) { ... }); 
    return promise; 
} 

args.setPromise(removeExtendedSplash());

你也可以試試這個擴展啓動畫面的實現:https://gist.github.com/petertakacs/5330117

+0

是的,我已經知道了承諾辦法(微軟有它全部散落在他們的網站,他們希望你使用異步承諾制)。我當時在執行我的特定項目時遇到了麻煩(儘管承諾,啓動畫面會立即消失,我肯定是我的錯),但我已經放棄了相當長一段時間了。儘管如此,我會爲你的帖子+1,因爲這是其他人看到的重要信息,因爲用WinJS.Promise對象構建應用程序是正確的方法。 – Arctic