Xamarin.Forms+Prism(2)—— 基本使用 NavigationService,xamarin.forms

來源:互聯網
上載者:User

Xamarin.Forms+Prism(2)—— 基本使用 NavigationService,xamarin.forms

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

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.