Xamarin.Forms+Prism(2)—— 基本使用 NavigationService 相對路徑和絕對路徑


本文主要對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,我們現在可以測試點擊后退,會發現直接退出程序,邏輯修改成功。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM