當我的Windows MainPage加載到我的Windows Phone 7應用程序中時,它會觸發一個包含進度條和用戶控件中的圖形的彈出式啓動畫面。在顯示spash屏幕後,我在BackgroundWorker線程中執行一些工作以在顯示spash時加載一些資源。加載完成後,我忽略彈出窗口。這項技術在WindowsPhoneGeek上有詳細記錄。WP7 - 初始屏幕無法在調試器會話外工作
我今天注意到,儘管在Visual Studio下的調試中運行時這是完美的工作,但如果我沒有連接調試器直接運行相同的構建,則啓動畫面動畫和進度條從不出現,DoWork執行相同的操作至少兩次。我可以看到MainPage構造函數以及OnNavigatedTo被調用,但彈出窗口仍然不顯示,並且默認的jpg splash圖像保留在屏幕上,直到工作線程完成。然後彈出窗口顯示< 1秒,主頁面顯示。再一次,當通過VS 2010進行調試時,這一切都完美無缺。
這些都在模擬器中,我還沒有設備。我今天剛剛注意到了這一點,恰巧(?)昨天晚上我剛把環境更新到7.1。
// Constructor
public MainPage()
{
InitializeComponent();
IDictionary<string, object> state = Microsoft.Phone.Shell.PhoneApplicationService.Current.State;
if (!state.ContainsKey(STATE_WAS_LOADED))
{
state[STATE_WAS_LOADED] = "LOADED";
this.LayoutRoot.Visibility = System.Windows.Visibility.Collapsed;
_popup = new Popup();
_popup.Child = new NPGSplash();
System.Diagnostics.Debug.WriteLine("{0}: Displaying Splash Popup", DateTime.Now.ToString("ss.ffff"));
_popup.IsOpen = true;
// Asynchronously load the biggest dataset
StartLoadingData();
}
}
private void StartLoadingData()
{
_worker = new BackgroundWorker();
_worker.DoWork += new DoWorkEventHandler(_worker_DoWork);
_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_worker_RunWorkerCompleted);
_worker.RunWorkerAsync();
}
void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Dispatcher.BeginInvoke(() =>
{
System.Diagnostics.Debug.WriteLine("{0}: Splash RunWorkerCompleted", DateTime.Now.ToString("ss.ffff"));
this.LayoutRoot.Visibility = System.Windows.Visibility.Visible;
this._popup.IsOpen = false;
});
}
編輯:
我結束了這個星期買在eBay上的設備,以確保我不發佈一個應用程序,我無法確認它正常工作。我可以確認無論什麼問題,在設備上運行應用程序時都不會發生。好消息。儘管如此,我仍然無法解釋在constructor被調用後,在我的應用程序中出現大約3-5秒的停頓。我甚至改變了構造函數中的邏輯來設置System.Windows.Threading.DispatcherTimer
以在100ms內觸發我的邏輯。當此代碼執行時,構造函數完成,但計時器不會打勾3-5秒。非常奇怪,只有在仿真器未連接到調試器時。
我正在考慮將init代碼放入OnNavigatedTo中。我試過了,它的表現完全相同。今晚我會看看把彈出窗口放在XAML中的想法。我從來沒有嘗試過。 – CactusPCJack