在WP7 APP的開發中,頁面之間的跳轉是一個再常見不過的操作啦,在Xaml中能實現,在Xaml背後的cs檔案中用NavigationService能實現,但是在使用MVVM開發模型之後,在ViewModel中就不如前面的實現起來直觀了。
其實在ViewModel中實現頁面的跳轉也很簡單,下面的代碼:
using Microsoft.Phone.Controls;var root = App.Current.RootVisual as PhoneApplicationFrame;root.Navigate(new Uri("/NextPage.xaml", UriKind.Relative));
一般的任務情況下,這幾行代碼已經能夠完成啦,但是有一個問題,讓我們再細緻探討一下:做一個使用者登入的功能,按照正常的商務程序,使用者在某頁面輸入完使用者名稱和密碼之後,程式串連伺服器端驗證使用者的合法性(此過程需要網路連接,過程可能需要耗費時間較長,並且是非同步作業),當伺服器返回資料之後,程式判斷如果是合法使用者則跳轉到使用者個人資訊介面,否則給出錯誤提示。
在VIEWMODEL處理伺服器返回資料之後選擇行為的代碼應該是這樣的:
if (result.IsSuccess == true) { var root = App.Current.RootVisual as PhoneApplicationFrame; root.Navigate(new Uri("/UserInfo.xaml", UriKind.Relative)); } else { //顯示出錯資訊。 }
但正如剛才所說的,由於要串連伺服器,此過程需要網路連接,如果遇到網路訊號不好,可能使用者在點擊“登入”按鈕之後,等了10秒都沒有得到任何成功或者失敗的提示(使用者體驗好一點的可能會顯示一個“登入中”),使用者等的不耐煩了按了後退鍵或者其他動作,進入了別的頁面,突然,伺服器的反饋資料回來之後,上面的ViewModel代碼將使用者強行帶入了個人資訊頁面,So,使用者很生氣,後果很嚴重。
加一個判斷就好了:
if (result.IsSuccess == true) { var root = App.Current.RootVisual as PhoneApplicationFrame; if (root.CurrentSource == new Uri("Login.xaml", UriKind.Relative)) root.Navigate(new Uri("UserInfo.xaml", UriKind.Relative)); } else { //顯示出錯資訊 }
(另外發現部落格園的文字被其他網站採集嚴重,而且好多網站連個出處都不寫,轉載請註明出處~ http://www.cnblogs.com/vistach)