本文主要對Prism框架下的導航服務NavigationService進行一次介紹和使用。設計模式
一、打開VS,能夠看到左側的已安裝模版裏面有:app
二、建立完成後,從PCL項目中,看到App.xaml.cs中的代碼知道,程序如今的邏輯是打開APP->NavigationPage->MainPage(傳遞title參數);框架
三、先在Views文件夾裏面添加一個Prism ContentPage,能夠看到LoginPageViewModel會自動在ViewModels添加。async
四、假如咱們如今要修改邏輯打開APP的時候,要判斷上次是否登陸狀態,來判斷是否須要跳轉到LoginPage:ide
如今咱們就要修改邏輯,在App.xaml的OnInitialized()裏,添加代碼;函數
protected override void OnInitialized() { InitializeComponent(); bool isLogin = false;//這裏只是一個假設值,真實項目中,應該判斷是否已登陸。 if (isLogin) { //已經登陸 NavigationService.NavigateAsync("NavigationPage/MainPage?title=Hello%20from%20Xamarin.Forms"); } else { NavigationService.NavigateAsync("LoginPage"); } }
在LoginPage的Xaml中添加一個登陸按鈕,能夠看出是MVVM的設計模式:測試
<Button Text="登陸" Command="{Binding LoginCommand}"></Button>
修改LoginPageViewModel的代碼,新建一個構造函數,參數就是INavigationService,這是Prism自帶的導航服務,會自動傳遞過來的;spa
public class LoginPageViewModel : BindableBase { public LoginPageViewModel() { } private INavigationService _navigationService; /// <summary> /// 登陸操做綁定的命令 /// </summary> private DelegateCommand<EventArgs> _loginCommand; public DelegateCommand<EventArgs> LoginCommand { get { if (_loginCommand == null) { _loginCommand = new DelegateCommand<EventArgs>(async r => { //這裏作登陸操做,如訪問你的WebApi await Task.Delay(2000); //這裏假如已經作完登陸操做,保存用戶信息,並跳轉到MainPage; await _navigationService.NavigateAsync("NavigationPage/MainPage"); }); } return _loginCommand; } } public LoginPageViewModel(INavigationService navigationService) { _navigationService = navigationService; } }
假如咱們如今這樣作,用戶登陸成功點擊登陸成功,跳轉到NavigationPage->MainPage後,用戶點擊後退,會跳回登陸頁面。這就須要咱們手動設置NavigationService中的棧設計
把跳轉代碼修改成,這樣咱們假如用戶點擊後退,也不會回到MainPage頁面了。3d
await _navigationService.NavigateAsync("app:///NavigationPage/MainPage"); //await _navigationService.NavigateAsync("NavigationPage/MainPage");
還有,若是ViewModel類實現INavigationAware接口,會實現3個方法,就是提供導航準備進入,導航已經進入,導出已經跳出三種基類方法。
public void OnNavigatedFrom(NavigationParameters parameters) { } public void OnNavigatingTo(NavigationParameters parameters) { } public void OnNavigatedTo(NavigationParameters parameters) { if (parameters.ContainsKey("title")) Title = (string)parameters["title"] + " and Prism"; }
最後:
一、要注意程序全部要使用的Page,都須要在App.xaml代碼中註冊,由於Prism的服務是基於Page的,因此註冊的對象基類必須是Page
二、使用NavigationService進行導航時,填寫的字符串Page名字,必須大小寫匹配,如寫成mainpage,會報錯。
三、程序運行截圖:程序運行,直接跳轉到LoginPage,點擊登陸按鈕,程序等待2秒後會跳轉到MainPage,咱們如今能夠測試點擊後退,會發現直接退出程序,邏輯修改爲功。