2012-05-16 34 views
0

我想在App.xaml.cs類中進行身份驗證,如果用戶存在於數據庫中,我想將用戶引導至成員頁面,否則要直接將用戶公開頁。我知道如何使用根框架導航,但問題是即使我的webervice異步方法是在RootFrameNavigating它之前未執行的情況下編寫的。 我的代碼是在這裏在RootFrame.Navigating事件之前執行webservice方法windows phone 7

在應用程序構造

 dclient.GetUserByPhoneIdCompleted += new EventHandler<GetUserByPhoneIdCompletedEventArgs> (dclient_GetUserByPhoneIdCompleted); 
     dclient.GetUserByPhoneIdAsync(GetDeviceUniqueID()); 
     if (getUserbyPhoneIdCompleted) 
       RootFrame.Navigating += new NavigatingCancelEventHandler(RootFrame_Navigating); 

,並在我的方法

 if (e.Uri.ToString().Contains("/MainPage.xaml") != true) 
      return; 
     e.Cancel = true; 

     RootFrame.Dispatcher.BeginInvoke(delegate 
     { 
      if (userId == -1) 
       RootFrame.Navigate(new Uri(string.Format("/View/PublicPage.xaml"), UriKind.Relative)); 
      else 
       RootFrame.Navigate(new Uri(string.Format("/View/WelcomePage.xaml"), UriKind.Relative)); 
     }); 

,並在我的web服務方法的整數返回,我得到的用戶ID有

像此

void dclient_GetUserByPhoneIdCompleted(object sender, GetUserByPhoneIdCompletedEventArgs e) 
{ 
    userId = e.Result; 
    getUserbyPhoneIdCompleted = true; 
} 
+0

如果啓動頁面沒有得到加載quickliy,該應用程序不會通過市場認證。避免在此之前進行此認證。 – TutuGeorge

回答

0

您的應用程序啓動後,您將向Web服務發送異步調用。然後導航事件被觸發(爲什麼它不是?你沒有阻塞線程),並且你的事件處理程序被調用。在那裏,你取消了導航,並檢查web服務返回的值。但由於沒有任何等待,您可以在web服務調用結束之前達到該點。 有很多方法可以解決這個問題,但一個我建議是:

  • 別叫在應用程序啓動web服務,讓應用程序導航到自定義加載頁面
  • 在該頁面中,調用互聯網服務和顯示「正在載入」消息
  • 使用Web服務調用的結果,重定向到任何你想要的頁面,然後從堆棧中刪除加載頁面

不要忘了處理的情況下,當webservice調用返回一個錯誤。