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

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  2. ipv6 dns list

    ip v6 DNS list: 将首选DNS服务器地址填上2001:778::37 备用DNS服务器地址填上2001:df8:0:7::1

  3. 语言那点事,crt

    C语言标准(不管是ANSI 还是ISO)包含2部分,一部分是语言本身的标准,另一部分是C标准函数库.C标准函数库规定了函数的原型和功能,但是并没限定这些函数要怎么实现.所谓满足标准C规定的C编译器,不 ...

  4. MVC Controller return 格式之JsonResult、ContentResult、RedirectResult……

      //语法 public class JsonResult : ActionResult public class ContentResult : ActionResult public class ...

  5. Java多线程——不可变对象

    不可变对象条件 对象需要满足一下三个条件才是不可变对象: 1.对象创建以后其状态就不能修改 2.对象所有域都是final类型 3.对象是正确创建的(对象在创建期间,this引用没有溢出) 简而言之就是 ...

  6. Creating Context Menu / 创建上下文菜单项 / VC++, Windows, DLL, ATL, COM

    创建上下文菜单项 1.新建一个ATL Project. 2.建议将Project Property中Linker – General - “Register Output” 设为no,C/C++ - ...

  7. 初识Quartz(一)

    首先需要一个任务: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package quartz_proj ...

  8. android studio中文乱码问题

    在build.gradle中加入代码: tasks.withType(JavaCompile) { options.encoding = "UTF-8" }

  9. code::blocks怎么设置命令行参数

    Project->Set Program's Arguments...然后在相应的输入框中输入命令行参数

  10. UVA 12169 Disgruntled Judge 扩展欧几里得

    /** 题目:UVA 12169 Disgruntled Judge 链接:https://vjudge.net/problem/UVA-12169 题意:原题 思路: a,b范围都在10000以内. ...