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

     

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 阮小二买彩票
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 企业奖金发放
    Java实现 蓝桥杯VIP 算法提高 企业奖金发放
    让程序后台隐藏运行
    只要你喜欢,并且可以养家糊口,就是好的
  • 原文地址:https://www.cnblogs.com/loda7023link/p/6722786.html
Copyright © 2011-2022 走看看