Xamarin.Forms+Prism(2)—— 基本使用 NavigationService 相对路径和绝对路径

本文主要对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,咱们如今能够测试点击后退,会发现直接退出程序,逻辑修改为功。

 

相关文章
相关标签/搜索