在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)