本文主要對Prism框架下的導航服務NavigationService進行一次介紹和使用。 1、打開VS,可以看到左側的已安裝模版裡面有: 2、創建完成後,從PCL項目中,看到App.xaml.cs中的代碼知道,程式現在的邏輯是打開APP->NavigationPage->MainPage(傳遞ti ...
本文主要對Prism框架下的導航服務NavigationService進行一次介紹和使用。
1、打開VS,可以看到左側的已安裝模版裡面有:
2、創建完成後,從PCL項目中,看到App.xaml.cs中的代碼知道,程式現在的邏輯是打開APP->NavigationPage->MainPage(傳遞title參數);
3、先在Views文件夾裡面添加一個Prism ContentPage,可以看到LoginPageViewModel會自動在ViewModels添加。
4、假如我們現在要修改邏輯打開APP的時候,要判斷上次是否登錄狀態,來判斷是否需要跳轉到LoginPage:
現在我們就要修改邏輯,在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自帶的導航服務,會自動傳遞過來的;
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頁面了。
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"; }
最後:
1、要註意程式所有要使用的Page,都需要在App.xaml代碼中註冊,因為Prism的服務是基於Page的,所以註冊的對象基類必須是Page
2、使用NavigationService進行導航時,填寫的字元串Page名字,必須大小寫匹配,如寫成mainpage,會報錯。
3、程式運行截圖:程式運行,直接跳轉到LoginPage,點擊登錄按鈕,程式等待2秒後會跳轉到MainPage,我們現在可以測試點擊後退,會發現直接退出程式,邏輯修改成功。