• 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框架的应该没什么难度的。

       

      好吧,这次就这样了。。。

  • 相关阅读:
    在 Cocos2d-x 中添加自己的微博链接
    关于屏幕适配
    [抽象工厂模式]在游戏开发中的应用
    字符串排列组合
    子矩阵最大和
    网易游戏编程题第二题
    动态规划,最大子段和
    C++的四种显示类型转换
    多线程编程
    预处理等等
  • 原文地址:https://www.cnblogs.com/qiandi/p/5618766.html
Copyright © 2020-2023  润新知