zoukankan      html  css  js  c++  java
  • 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,我们现在可以测试点击后退,会发现直接退出程序,逻辑修改成功。

     

  • 相关阅读:
    良好的三元组(求已排列好的数组中各个元素的排位)
    山理工oj 2556传说中的数据结构
    山理oj 1177 时间间隔
    山理oj1525:字符统计2
    linux常用命令
    多线程并发教程
    合理设置线程数量
    Java多线程处理任务(摘抄)
    解决2013Lost connection to MySQL server during query错误方法
    javaMail邮件发送
  • 原文地址:https://www.cnblogs.com/loda7023link/p/6722786.html
Copyright © 2011-2022 走看看