Xamarin.Forms学习之Page Navigation(二)
在上一篇的文章中,对页面常规的导航做一些分享,然而在实际的编程中,页面数据的保持,传值等等都有很多,这篇文章就对这些相关内容做一个分享和记录,有问题,希望大家留言指正。这一篇从实现业务逻辑来讲并没有什么特别的,这里主要是说说通过Properties和生命周期实现数据的“保持”。当然这里遇到了一个让我懵逼的问题,电子书中介绍说,Properties的值是会一直保持的,直到App卸载,但是在我的安卓机中实验,程序终止后,值就为空了,不知是我看掉了什么东西还是怎么了,不知道大家有没有遇到这个问题,希望在留言中分享下。
先从一个小实例说起吧,比如有一个电商网站,当用户从商品详细页点击购买的时候,会提示叫用户登录,登录成功后会跳转到订单页面,用户会填入一些信息(地址,联系电话等等),但是这个时候用户发现不包邮,不打算再买这个商品了,用户点击返回的时候,我们不希望他在回到登录页面,这个时候只需在登录页面中调用Pop就行了,如下就自动会从page stack中移除登录页了:
await Navigation.PopAsync();
继续,如用户继续觉得这个商品是个急需的东西,那10元的邮费是可以承受的,他又返回了订单页,得,先前的填写的数据都不在了,从用户体验来讲,肯定是不好的,那怎么才能实现数据保持呢,推荐的常用的有两种方法:
第一种就是使用Application的Properties的属性,这是一个IDictionary<string, object>类型的字典型,虽然value是个object类型,但是还是建议做一个约束,使用C#的一些基本类型(如int、string。。。),电子书原文为:
Also, you should restrict the data types used with Properties to the basic data types supported by .NET and C#, such as string, int, and double.
调用方式如下:
//App.cs方法中的调用
Properties["Test"] = "Test Properties"; //在其他页面的调用
Label01.Text = Application.Current.Properties["Test"].ToString();
在App类中有三个方法的重写即OnStart、OnSleep和OnResume,这个三个当中呢,一般来说OnSleep比较重要点,用的较多。
这里插一下,程序启动后是先调用App的构造函数,然后才调用OnStart
当按下Home键的时候程序会调用OnSleep的重写,这个时候我们就可以把中间类或者把App类中相关的属性进行“保持”。简单示例如下:
protected override void OnSleep()
{
// Handle when your app sleeps
Properties["Transient"] = "Test Properties";
}
但是订单数据这类的数据并不建议用或者说不建议直接用Properties,这类数据的保持建议用第二种,即ViewModel,这也是官方建议的,Properties比较适合用户设置类的数据,比如说颜色、背景啊之类的。使用ViewModel呢当然不能像正常的那样在当前页面new,下面的代码做一个简单的演示吧:
public class App:Application
{
public OrderViewModel OrderViewModel {get;private set;} public App()
{
....
OrderViewModel = new OrderViewModel();
}
} //OrderPage
public OrderPage()
{
BindingContext = (Application.Current as App).OrderViewModel;
}
这种方式我想大家都还是比较了解,还有页面间传值就不多说了,无非也就是构造函数、属性、方法、事件、中间类这些方式,唯一不同的是Xamarin自己给自己代盐了个MessagingCenter类(其实还有ViewModelBase,简单点说就是他自己实现了一套MVVM的框架),在WPF或者Silverlinght中用过第三方MVVM框架的应该没什么难度的。
好吧,这次就这样了。。。
Xamarin.Forms学习之Page Navigation(二)的更多相关文章
- Xamarin.Forms学习之Page Navigation(一)
在最初接触Xamarin.Forms的时候,我是跟着Xamarin官方的名为“learning-xamarin-ebook”的pdf文档进行学习的,我在成功运行Hello world程序之后,我开始跟 ...
- Xamarin.Forms学习之位图(二)
上篇文章分享了如何加载网络图片和PCL中的图片,所以今天继续分享关于如何加载平台的内嵌图片,在这之前说一下上篇文章开头的一个问题:为什么不能加载UWP项目,这是因为我升级了UWP的SDK,而Xamar ...
- Xamarin.Forms学习之XAML命名空间
大家好,我又悄咪咪的来了,在上一篇的Xamarin文章中简单介绍了Xamarin的安装过程,妈蛋没想到很多小朋友很感激我,让他们成功的安装了Xamarin,然后......成功的显示了经典的两个单词( ...
- Xamarin.Forms学习系列之Android集成极光推送
一般App都会有消息推送的功能,如果是原生安卓或者IOS集成消息推送很容易,各大推送平台都有相关的Sample,但是关于Xamarin.Forms的消息推送集成的资料非常少,下面就说下Xamarin. ...
- Xamarin.Forms学习之Platform-specific API和文件操作
这篇文章的分享原由是由于上篇关于Properties的保存不了,调用SavePropertiesAsync()方法也不行,所以我希望通过操作文件的方式保存我的需要的数据,然后我看了一下电子书中的第二十 ...
- Xamarin.Forms学习之初
微软的Build 2016结束的有段时间了,对于一个简单的小屌丝程序员--我来说,关注最大的无疑是Xamarin的免费(开源什么的让大神们上吧),内心激动啊.大会结束的周末我就迫不及待的安装了,然后. ...
- Xamarin.Forms学习系列之Syncfusion 制作图形报表
Syncfusion是一家微软生态下的第三方组件/控件供应商,除了用于HTML5和JavaScript的控件外,他们产品还涉及如下领域: WEB ASP.NET MVC ASP.NET WebForm ...
- Xamarin.Forms 学习系列之底部tab
App中一般都会有一个底部tab,用于切换不同的功能,在Xamarin中应该制作底部tab了,需要把Android的TabbedPage做一次渲染,IOS的则不用,接下来说下详细步骤: 1.在共享项目 ...
- Xamarin.Forms 学习系列之优秀UI收集
1.各种优秀UI例子 https://github.com/jsuarezruiz/xamarin-forms-goodlooking-UI 输入框例子 https://github.com/enis ...
随机推荐
- 【Python3 爬虫】08_正则表达式(元字符与语法)
元字符表 符号 说明 示例 . 表示任意字符 'abc' >>>'a.c' >>>结果为:'abc' ^ 表示字符开头 'abc' >>> ...
- hdu3415 Max Sum of Max-K-sub-sequence 单调队列
//hdu3415 Max Sum of Max-K-sub-sequence //单调队列 //首先想到了预处理出前缀和利用s[i] - s[j]表示(j,i]段的和 //之后的问题就转换成了求一个 ...
- 远程调用——hessian使用入门
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用的是二进制协 ...
- 用jQuery和PHP来实现转盘抽奖程序
准备工作 首先要准备素材,抽奖的界面用到两张图片,圆盘图片和指针图片,实际应用中可以根据不同的需求制作不同的圆盘图片. 接着制作html页面,实例中我们在body中加入如下代码: <div cl ...
- linux 进入 GNOME X 界面
CentOS 安装Gnome CentOSVmwareLinuxBlogHTML 刚开始装系统的时候,没有选Gnome或者KDE,现在想装个玩玩. 简单的安装可以参考这个:http://huruxi ...
- Atitit.软件开发的非功能性需求attilax 总结At
Atitit.软件开发的非功能性需求attilax 总结 1. 运行环境约束:用户对软件系统运行环境的要求. 1 2. 兼容性 2 3. 7.6 数据库 database (imp by ati) ...
- Atitit.软件命名空间 包的命名统计 及命名表(2000个名称) 方案java package
Atitit.软件命名空间 包的命名统计 及命名表(2000个名称) 方案java package 1. 统计的lib jar 列表1 2. Code3 3. 常用包名按找字母排序(2000个)4 ...
- 当synchronized关键字和this关键字
package cn.itcast_01_mythread.thread.testThread; public class MyThreadWithImpliment_Synch_method imp ...
- VLine[-1]=VLine[width]=128 数组的负一地址代表啥
最近在调算法是,涉及到rgb转yuv数据的一个函数,出现了这种常见错误:如下 unsigned char *VLine = (new unsigned char[width+2]);//+1; ...
- UNIX网络编程卷1 server程序设计范式1 并发server,为每一个客户请求fork一个进程
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.传统并发server调用 fork 派生一个子进程来处理每一个客户 2.传统并发serv ...