2011-08-12 83 views
1

當我的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秒。非常奇怪,只有在仿真器未連接到調試器時。

回答

0

這裏的問題似乎是,您從未將Popup控件附加到可視化樹上。說實話,我不知道爲什麼這個功能可以與附加的調試器一起工作,但是我會從你的代碼中解釋出來。

我認爲你需要做的是將Popup控件作爲一個元素添加到MainPage的XAML中,以便將它附加到可視化樹上。

我要說的另一件事是,可能值得將所有的數據加載代碼從構造函數中移出,或者替換爲OnNavigatedTo的覆蓋或Loaded事件的處理程序。一般來說,最好儘可能保持構造器的簡潔和簡潔(並且我很欣賞你使用後臺工作器來加載數據)。

+0

我正在考慮將init代碼放入OnNavigatedTo中。我試過了,它的表現完全相同。今晚我會看看把彈出窗口放在XAML中的想法。我從來沒有嘗試過。 – CactusPCJack