2011-11-22 37 views
0

大家追了上來,NullReferenceException異常的解決方案在一個連續的循環

與大多數的應用程序,如果設置了密碼,IM中需要包含一個登錄頁面,我的應用程序。應用程序的預期行爲是,只有在設置了密碼的情況下,它才能導航到passwordpage.xaml,並輸入正確的密碼時,它應該導航到mainpage.xaml。如果密碼沒有設置,它應該直接導航到mainpage.xaml。

以下博客建議需要重新導航,以便在app.xaml.cs中包含一項檢查,以確定應用需要導航到哪個頁面。

但現在的問題是,密碼頁面的進一步導航沒有發生。它在設置密碼時導航到密碼頁面,但是在簽入密碼匹配後,它不會在mainpage.xaml上移動,而是會返回到rootframe_navigating事件處理程序並執行循環。

http://blogs.msdn.com/b/ptorr/archive/2010/08/28/redirecting-an-initial-navigation.aspx

這是app.xaml.cs

void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e) 
    { 
     //throw new NotImplementedException(); 
     if (e.Uri.ToString().Contains("/MainPage.xaml") != true) 
      return; 
     CycleManager pCycMan = CycleManager.instance; 
     bool checkOk = false; 
     pCycMan.ReadFromIsolatedStorage(); 
     if (pCycMan.GetPasswordEnabled()) 
     { 
      checkOk = true; 
     } 

     e.Cancel = true; 
     RootFrame.Dispatcher.BeginInvoke(delegate 
     { 
      if (checkOk) 
       RootFrame.Navigate(new Uri("/PasswordPage.xaml", UriKind.Relative)); 

      else 
       RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); 
     }); 
    } 

的功能,這是在passwordpage.xaml

private void OnClick(object sender, RoutedEventArgs e) 
    { 
     CycleManager pCycMan = CycleManager.instance; 
     if (pCycMan.GetPassword() == passwordBox1.Password) 
     { 
      NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); 
     } 
     else 
     { 
      MessageBox.Show("Incorrect Password"); 
     } 
    } 

任何書面上的按鈕點擊功能建議?

Alfah

回答

0

我管理這樣解決它,

我不知道它是否正確的做法。但它的工作原理。首先,我將默認開始頁面更改爲WMAppManifest.xaml中名爲RootPage.xaml的不存在頁面。然後在事件處理程序中,我改變了MainPage.xaml中,以RootPage.xaml

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

我不得不從返回堆棧條目中另有布萊恩回退出該應用程序將再次把密碼頁面刪除密碼頁面。

編號:http://www.markerstudio.com/technical/2010/09/windows-phone-7-how-to-always-launch-your-app-where-the-user-left-off/#comment-916

Alfah

2

如果你要回你在後面的頁面一個頁面,你應該使用內置的NavigationService.GoBack()方法。這可以讓手機處理後臺堆疊的頁面。

如果您需要前進但從未回到頁面上,那麼在Mango中,您現在需要使用NavigationService.RemoveBackEntry()手動從後備棧中移除該頁面。

看着你的代碼,導航處理程序將始終激活。您似乎在檢查是否啓用了密碼,而不是用戶是否已通過身份驗證。我只想說檢查密碼的邏輯是錯誤的。

+0

+1這裏。廢棄您當前的方法,並在主頁的'Loaded'或'OnNavigatedTo'方法中執行check/redirect to passwordpage。然後在設置密碼時使用'GoBack()'。 –

+0

@adam GoBack()不能被使用,因爲在後端堆棧中沒有條目,即它還沒有導航到mainpage.xaml。它檢查app.xaml中的條件,然後轉到密碼頁面,然後移動到主頁面。xaml但它不會移動到mainpage.xaml – alfah

+0

@alfah這很可能是因爲您試圖取消導航事件並在同一代碼塊中啓動新事件。嘗試將密碼頁面設置爲開始頁面,以便您不需要劫持導航處理程序......用戶第一眼看到的只是一個登錄頁面。然後,您可以向前導航並彈出後備堆棧中的密碼頁面,從此以後的所有內容都應該是正常行爲。 –

相關問題