本文主要对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(); //这里假如已经做完登录操作,保存用户信息,并跳转到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,我们现在可以测试点击后退,会发现直接退出程序,逻辑修改成功。

Xamarin.Forms+Prism(2)—— 基本使用 NavigationService 相对路径和绝对路径的更多相关文章

  1. Xamarin.Forms+Prism(1)—— 开发准备

    本次随笔连载,主要用于记录本人在项目中,用Xamarin.Forms开发APP中所使用的第三方技术或一些技巧. 准备: 1.VS2017(推荐)或VS2015: 2.JDK 1.8以上: 3.Xama ...

  2. Xamarin.Forms+Prism(3)—— 简单提示UI的使用

    这次给大家介绍两个比较好用的提示插件,如成功.等待.错误提示. 准备: 1.新建一个Prism Xamarin.Forms项目: 2.右击解决方案,添加NuGet包: 1)Acr.UserDialog ...

  3. LINKs: Xamarin.Forms + Prism

    LINK 1 - How to use Prism with Xamarin.Forms http://brianlagunas.com/first-look-at-the-prism-for-xam ...

  4. Xamarin.Forms + Prism,整理页面导航跳转流程

    3个Page,Page1 -> Page2 -> Page3 -> Page2 -> Page1. PageViewModel实现接口:INavigatingAware, IN ...

  5. Xamarin.Forms 开发资源集合(复制)

    复制:https://www.cnblogs.com/mschen/p/10199997.html 收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 S ...

  6. Xamarin.Forms 开发资源集合

    收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 Snppts: Xamarin Forms UI Snippets. Prebuilt Templat ...

  7. Xamarin.Forms开发APP

    Xamarin.Forms+Prism(1)—— 开发准备 准备: 1.VS2017(推荐)或VS2015: 2.JDK 1.8以上: 3.Xamarin.Forms 最新版: 4.Prism 扩展, ...

  8. Prism for Xamarin.Forms

    一.使用环境 OS:Win 10 16273 VS:VS2017- 15.3.4 Xamarin:4.6.3.4,nuget:2.4 Android Emulator:Visual Studio fo ...

  9. 走进 Prism for Xamarin.Forms

    一.使用环境 OS:Win 10 16273 VS:VS2017- 15.3.4 Xamarin:4.6.3.4,nuget:2.4 Android Emulator:Visual Studio fo ...

随机推荐

  1. 我在开发中所遇到的iOS7新特性以及iOS7与iOS6的适配问题总结

      ⓵UIImageView 1. // iOS7添加的对图像颜色处理的功能,过滤颜色的功能 2. _imageView.tintColor = [UIColor blueColor]; 3. //重 ...

  2. bzoj 2039 最小割模型

    比较明显的网络流最小割模型,对于这种模型我们需要先求获利的和,然后减去代价即可. 我们对于第i个人来说, 如果选他,会耗费A[I]的代价,那么(source,i,a[i])代表选他之后的代价,如果不选 ...

  3. mongoDB的简单使用

    1.客户端连接: ./mongo 2.数据库 一个mongodb中可以建立多个数据库. MongoDB的默认数据库为"db",该数据库存储在data目录中. MongoDB的单个实 ...

  4. php使用curl模拟登录带验证码的网站

    需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...

  5. linux驱动学习(二) Makefile高级【转】

    转自:http://blog.csdn.net/ghostyu/article/details/6866863 版权声明:本文为博主原创文章,未经博主允许不得转载. 在我前一篇写的[ linux驱动学 ...

  6. pymysql 线程安全pymysqlpool

    # -*-coding: utf-8-*- # Author : Christopher Lee # License: Apache License # File : test_example.py ...

  7. 消除Git diff中^M的差异

    消除Git diff中^M的差异 在Windows上把一个刚commit的文件夹上传到了Ubuntu.在Ubuntu上使用git status查看,发现很多文件都被红色标注,表示刚刚修改未add.在W ...

  8. Centos 7.3 安装 Mongodb

    通过yum 安装: yum install -y mongodb-server Mongodb操作命令: #启动 systemctl start mongod.service #关闭 systemct ...

  9. CodeForces 669A

    链接:http://codeforces.com/problemset/problem/669/A 本文链接:http://www.cnblogs.com/Ash-ly/p/5442950.html ...

  10. ASP.NET Core 2.2 基础知识(五) 环境

    一.环境变量 系统启动时,会读取环境变量 ASPNETCORE_ENVIRONMENT ,并将该变量的值存储在 IHostingEnvironment.EnvironmentName 字段中.如: 新 ...