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

    * 元注解@Target,@Retention,@Documented,@Inherited * * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: * Elem ...

  2. selenium从入门到应用 - 7,testNG的DataProvider

    本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...

  3. 【Python3 爬虫】11_报错No module named 'requests'

    从网上下载了一段源码,执行过程中报错: No module named 'requests' 一看英文就明白是咋回事了~ 是由于:没有模块requests 解决方案 打开cmd,在窗口运行命令:pip ...

  4. 【Python3 爬虫】09_正则表达式(re.math()、re.search()、re.sub()、全局匹配函数)

    re.math()函数 从源字符串的起始位置匹配一个模式 语法:re.match(pattern, string, flag) 第一个参数代表对应的正则表达式,第二个参数代表对应的源字符,第三个参数是 ...

  5. 【BIEE】13_BIEE组件介绍(补充)

    Oracle BI Server 该组件主要是管理RPD的,如果该组件不正常,那么Admin Tool将无法联机打开 Oracle交互式信息板 这个组件控制BIEE仪表盘,我们已经建立好的分析.提示等 ...

  6. Visual studio C++ MFC之点击按钮(菜单栏)生成新窗口

    背景 当前做的APP有菜单栏,菜单栏有一项需要对下位机相关参数进行设置,则必须弹出一个窗口来实现设置操作.本篇即对点击菜单栏生成新的窗口,在新的窗口内完成相应计划后结束新窗口并返回原窗口的方法进行简述 ...

  7. asp.net core mvc视频A:笔记6-1.应用发布与部署

    显示:直接使用上节课的项目 一.使用vs发布应用 这里选择发布到文件夹,当然你可以选择其他的发布方式 部署模式:(我的VS里没有这个配置,不知道为啥...视频里有) 1.框架依赖:选择此模式,发布后需 ...

  8. ubuntu中安装apache ab命令进行简单压力测试

    1.安装ab命令 写道 apt-get install apache2-utils 2.ab命令参数说明. 写道 Usage: ab [options] [http[s]://]hostname[:p ...

  9. JSONP(转)

    1 什么是Jsonp? JSONP(JSON with Padding)是数据格式JSON的一种“使用模式”,可以让网页从别的网域要数据.另一个解决这个问题的新方法是跨来源资源共享. 由于同源策略,一 ...

  10. hdu 1829 &amp;poj 2492 A Bug&#39;s Life(推断二分图、带权并查集)

    A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...