在上一篇的文章中,对页面常规的导航做一些分享,然而在实际的编程中,页面数据的保持,传值等等都有很多,这篇文章就对这些相关内容做一个分享和记录,有问题,希望大家留言指正。这一篇从实现业务逻辑来讲并没有什么特别的,这里主要是说说通过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(二)的更多相关文章

  1. Xamarin.Forms学习之Page Navigation(一)

    在最初接触Xamarin.Forms的时候,我是跟着Xamarin官方的名为“learning-xamarin-ebook”的pdf文档进行学习的,我在成功运行Hello world程序之后,我开始跟 ...

  2. Xamarin.Forms学习之位图(二)

    上篇文章分享了如何加载网络图片和PCL中的图片,所以今天继续分享关于如何加载平台的内嵌图片,在这之前说一下上篇文章开头的一个问题:为什么不能加载UWP项目,这是因为我升级了UWP的SDK,而Xamar ...

  3. Xamarin.Forms学习之XAML命名空间

    大家好,我又悄咪咪的来了,在上一篇的Xamarin文章中简单介绍了Xamarin的安装过程,妈蛋没想到很多小朋友很感激我,让他们成功的安装了Xamarin,然后......成功的显示了经典的两个单词( ...

  4. Xamarin.Forms学习系列之Android集成极光推送

    一般App都会有消息推送的功能,如果是原生安卓或者IOS集成消息推送很容易,各大推送平台都有相关的Sample,但是关于Xamarin.Forms的消息推送集成的资料非常少,下面就说下Xamarin. ...

  5. Xamarin.Forms学习之Platform-specific API和文件操作

    这篇文章的分享原由是由于上篇关于Properties的保存不了,调用SavePropertiesAsync()方法也不行,所以我希望通过操作文件的方式保存我的需要的数据,然后我看了一下电子书中的第二十 ...

  6. Xamarin.Forms学习之初

    微软的Build 2016结束的有段时间了,对于一个简单的小屌丝程序员--我来说,关注最大的无疑是Xamarin的免费(开源什么的让大神们上吧),内心激动啊.大会结束的周末我就迫不及待的安装了,然后. ...

  7. Xamarin.Forms学习系列之Syncfusion 制作图形报表

    Syncfusion是一家微软生态下的第三方组件/控件供应商,除了用于HTML5和JavaScript的控件外,他们产品还涉及如下领域: WEB ASP.NET MVC ASP.NET WebForm ...

  8. Xamarin.Forms 学习系列之底部tab

    App中一般都会有一个底部tab,用于切换不同的功能,在Xamarin中应该制作底部tab了,需要把Android的TabbedPage做一次渲染,IOS的则不用,接下来说下详细步骤: 1.在共享项目 ...

  9. Xamarin.Forms 学习系列之优秀UI收集

    1.各种优秀UI例子 https://github.com/jsuarezruiz/xamarin-forms-goodlooking-UI 输入框例子 https://github.com/enis ...

随机推荐

  1. JavaScript内存示意图

    一.JavaScript内存示意图 二.js原理 1.js执行规则 (1)先定义 定义变量.定义函数.顺序:自上而下. (2)后执行 除了定义外的代码都是执行代码.顺序:自上而下. 2.动态开辟内存 ...

  2. CStdioFile类学习笔记<转>

    本文转自:http://www.cnblogs.com/JiMuStudio/archive/2011/07/17/2108496.html   CStdioFile类的声明保存再afx.h头文件中. ...

  3. 使用CAsyncSocket总结

    最近想起CAsyncSocket这个类,记得很早以前用过,现在却想不起来怎么用了,翻了翻以前的代码又看了看msdn感觉这个类做简单的异步socket太简单了,几行代码就可以搞定,在此先做个总结. 不管 ...

  4. net.reflector8.5.0.179过了试用期,要求输入序列号怎么办 注册机 破解

    去网上搜索“reflector keygen注册机下载”,随便找一个版本下载(如果你之前下载的软件自带有“Keygen.exe”注册机的话,直接用自带的注册机就可以了)1.断开网络2.下载安装原程序, ...

  5. arm linux c++11编译

    include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11 ...

  6. 谈谈varnish,squid,apache,nginx缓存的对比

    总是有人在问cache用什么,有varnish,squid,apache,nginx这几种,到底是我们用什么架构cache. 1.从这些功能上.varnish和squid是专业的cache服务,而ap ...

  7. webpack-dev-server 无法通过ip访问的问题

    使用Vue-cli生成的webpack脚手架,之前一直是可以通过本地ip + 端口来访问的.今天忽然不可以,百度一下才知道缺少了host参数. 打开package.json.在.scripts.dev ...

  8. leetcode第一刷_Balanced Binary Tree

    二叉平衡树好火啊.差点儿每一个公司的笔试题里都有它.考了好多次我都不会,挂笔试非常有可能就是由于它.另一个它的同伙叫二叉搜索树,貌似人气比它还要高一些. 二叉平衡树是什么样的树呢.是每一个节点的左右子 ...

  9. UITabelViewFootView(转)

    在处理UITableView表格时,我们希望在View底部添加按钮. 用户拖动UITableView时按钮能跟随移动. 如题,实现如下界面: - (CGFloat)tableView:(UITable ...

  10. rpm安装路径

    安装xxx.rpm包,以relocate 参数进行安装,安装到/opt/temp目录: rpm -ivh --relocate /=/opt/temp xxx.rpm: 以prefix进行安装: rp ...