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(); //这里假如已经做完登录操作,保存用户信息,并跳转到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 相对路径和绝对路径的更多相关文章
- Xamarin.Forms+Prism(1)—— 开发准备
本次随笔连载,主要用于记录本人在项目中,用Xamarin.Forms开发APP中所使用的第三方技术或一些技巧. 准备: 1.VS2017(推荐)或VS2015: 2.JDK 1.8以上: 3.Xama ...
- Xamarin.Forms+Prism(3)—— 简单提示UI的使用
这次给大家介绍两个比较好用的提示插件,如成功.等待.错误提示. 准备: 1.新建一个Prism Xamarin.Forms项目: 2.右击解决方案,添加NuGet包: 1)Acr.UserDialog ...
- LINKs: Xamarin.Forms + Prism
LINK 1 - How to use Prism with Xamarin.Forms http://brianlagunas.com/first-look-at-the-prism-for-xam ...
- Xamarin.Forms + Prism,整理页面导航跳转流程
3个Page,Page1 -> Page2 -> Page3 -> Page2 -> Page1. PageViewModel实现接口:INavigatingAware, IN ...
- Xamarin.Forms 开发资源集合(复制)
复制:https://www.cnblogs.com/mschen/p/10199997.html 收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 S ...
- Xamarin.Forms 开发资源集合
收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 Snppts: Xamarin Forms UI Snippets. Prebuilt Templat ...
- Xamarin.Forms开发APP
Xamarin.Forms+Prism(1)—— 开发准备 准备: 1.VS2017(推荐)或VS2015: 2.JDK 1.8以上: 3.Xamarin.Forms 最新版: 4.Prism 扩展, ...
- 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 ...
- 走进 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 ...
随机推荐
- POJ 2395 Out of Hay (prim)
题目链接 Description The cows have run out of hay, a horrible event that must be remedied immediately. B ...
- 转:js中javascript:void(0) 真正含义
from:http://www.jb51.net/article/71532.htm 在Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. 我想使用过ajax的都常 ...
- 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式
一 表结构如下: 万行 CREATE TABLE t_audit_operate_log ( Fid bigint(16) AUTO_INCREMENT, Fcreate_time int(10 ...
- 安装并解决purcell/emacs.d网络问题
安装: $ git clone https://github.com/purcell/emacs.d.git ~/.emacs.d 不使用https访问lisp库: $ sed -i 's/https ...
- 微信支付http://www.cnblogs.com/True_to_me/p/3565039.html
公众号支付有2种支付方式: JS API 支付:是指用户打开图文消息或者扫描二维码,在微信内置浏览器打开网页进行的支付.商户网页前端通过使用微信提供的 JS API,调用微信支付模块.这种方式,适合需 ...
- ANSI、ASCII、Unicode和UTF-8编码
来自:http://blog.163.com/yang_jianli/blog/static/161990006201371451851274/ --------------------------- ...
- 服务端指南 数据存储篇 | 聊聊 Redis 使用场景(转)
作者:梁桂钊 本文,是升级版,补充部分实战案例.梳理几个场景下利用 Redis 的特性可以大大提高效率. 随着数据量的增长,MySQL 已经满足不了大型互联网类应用的需求.因此,Redis 基于内存存 ...
- Android:Activity统一堆栈管理(实现随时finish特定或是所有Activty)
直接上代码: Activity管理类:AppManager /** * 应用程序Activity管理类:用于Activity管理和应用程序退出 * * @author BiHaidong * @ver ...
- HDU 1558 Segment set(并查集)
题意: 给你一些线段的起点和终点的坐标,最后问和某个线段相连的或者间接相连的线段有多少个(包括本身)? P X1 Y1X2 Y2 起点(X1,X2)终点(X2,Y2):按照出现次数依次编号为1,2, ...
- Socket学习总结系列(一) -- IM & Socket
写在准备动手的时候: Socket通讯在iOS中也是很常见,自己最近也一直在学习Telegram这个开源项目,Telegram就是在Socket的基础上做的即时通讯,这个相信了解这个开源项目的也都知道 ...