原文:windows phone 三种数据共享的方式(8)

本节实现的内容是数据共享,实现的效果描述:首先是建立两个页面,当页面MainPage通过事件导航到页面SecondPage是,我们需要将MainPage中的一些内容(比如一个字符串)传递到SecondPage中,SecondPage页面就出呈现出传递来的内容,当页面SecondPage通过事件导航到页面MainPage的时候,我们也把一些内容(比如一个字符串)传递与页面MainPage;

在建立的MainPage.xaml文件中我只添加了一个Button元素,设置显示的Content内容,并定义了该元素的触摸事件:

<Button x:Name="btn" Content="导航到第二个页面" Grid.Row="" Click="btn_Click"></Button>

MainPage的隐藏文件首先需要引用如下命名空间

//引用命名空间--PhoneApplicationService类用到using Microsoft.Phone.Shell;

MainPage的隐藏文件的全部代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
//引用命名空间--PhoneApplicationService类用到
using Microsoft.Phone.Shell;

namespace ShareData
{
    public partial class MainPage : PhoneApplicationPage
    {
        // 构造函数
        public MainPage()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 点击导航到第二个页面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Click(object sender, RoutedEventArgs e)
        {
            this.NavigationService.Navigate(new Uri("/SecondPage.xaml",UriKind.Relative));
        }
       //知识点①
        protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            //目标页--知识点②
            if (e.Content is SecondPage)
            {
                ((SecondPage)e.Content).ApplicationTitle.Text = "传递数据成功!";
            }
            //获得application对象的引用--知识点③
            (Application.Current as App).shareData = "通过APP类的属性共享数据";
            //应用程序的状态管理---知识点④
            PhoneApplicationService.Current.State["Share"] = "临时数据";

            base.OnNavigatedFrom(e);
        }

        ///// <summary>
        ///// 接受传递的值
        ///// </summary>
        ///// <param name="e"></param>
        //protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        //{
        //    //获得App类中的共享数据
        //    PageTitle.Text = (Application.Current as App).shareData.ToString();
        //    if (PhoneApplicationService.Current.State.ContainsKey("Share"))
        //    {
        //        //获得phoneapplicationService对象中设置state属性
        //        PageTitle.Text += "\n" + PhoneApplicationService.Current.State["Share"].ToString();
        //    }
        //    base.OnNavigatedTo(e);
        //}
    }
}

在建立的SecondPage.xaml文件中我只添加了一个Button元素,设置显示的Content内容,并定义了该元素的触摸事件:

<Button x:Name="btn" Content="导航到第1个页面" Grid.Row="" Click="btn_Click"></Button>

SecondPage的隐藏文件也需要引用相同的命名空间:

SecondPage的隐藏文件的全部代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
//引用命名空间--PhoneApplicationService类用到
using Microsoft.Phone.Shell;

namespace ShareData
{
    public partial class SecondPage : PhoneApplicationPage
    {
        public SecondPage()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 接受传递的值
        /// </summary>
        /// <param name="e"></param>
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            //获得App类中的共享数据
            PageTitle.Text = (Application.Current as App).shareData.ToString();
            if (PhoneApplicationService.Current.State.ContainsKey("Share"))
            {    
                //获得phoneapplicationService对象中设置state属性
                PageTitle.Text += "\n" + PhoneApplicationService.Current.State["Share"].ToString();
            }
            base.OnNavigatedTo(e);
        }
        /// <summary>
        /// 导航到第一个页面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Click(object sender, RoutedEventArgs e)
        {
            this.NavigationService.GoBack(); ;
        }

        //protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        //{
        //    if (e.Content is SecondPage)
        //    {
        //        ((SecondPage)e.Content).PageTitle.Text = "传递数据成功!";
        //    }
        //    (Application.Current as App).shareData = "通过APP类的属性共享数据";

        //    PhoneApplicationService.Current.State["Share"] = "临时数据";

        //    base.OnNavigatedFrom(e);
        //}
  

我们三种传递参数的中的一种是利用App类下设置属性进行多个页面共享,直接在App类中设置的公共属性:

  //设置共享的数据        public string shareData { get; set; }

至此全部代码已经呈现在这里,那我们是怎么进行数据共享的那,ok,详情如下:首先我们点击MainPage中的button事件,因为没有其他需要执行,此是件执行完毕后会立即执行MainPage页面中的OnNavigatedFrom方法,我们可以看到OnNavigatedFrom的参数是System.Windows.Navigation.NavigationEventArgs就是我们导航是的参数,OnNavigatedFrom方法执行完毕后就会导航到SecondPage页,SecondPage的隐藏文件首先加载的就是构造函数,然后就是OnNavigatedTo方法,所以我们在

OnNavigatedTo方法中接受传递来的数据;同样的原理我们可以把SecondPage中的数据传递到MainPage中,代码中注释掉的部分就是实现该内容,其中MainPage隐藏文件中注释掉的部分,如果去除注释,在运行的时候就会报错,因为在程序进入MainPage页面并触发Button事件后会执行OnNavigatedFrom方法,而此时并没有内容传递;

在此重写OnNavigatedFrom的方法是为了在此页面变为非活动页面的时候最后执行,所以有些操作可以在本页面进行完成;像我们这里的可以赋值于目标页面中TextBlock元素中的Text属性;

System.Windows.Navigation.NavigationEventArgs 参数就是记录了我们在点击导航时的一些信息,其中e.Content表示我们要导航到的页面,像这样((SecondPage)e.Content).ApplicationTitle.Text = "传递数据成功!";我们也访问目标也的属性

通过App类来进行共享参数是因为在程序中所有的页面都可以访问Application派生的App类,在App类中设置的属性当然我们也可以访问,其中Application类的静态属性Current返回的是Application对象的引用,如果想转换为派生的App类,强制转换即可

PhoneApplicationService类的实例化在App.xaml文件中

<Application 
    x:Class="ShareData.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"       
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone">

    <!--应用程序资源-->
    <Application.Resources>
    </Application.Resources>

    <Application.ApplicationLifetimeObjects>
        <!--处理应用程序的生存期事件所需的对象-->
        <shell:PhoneApplicationService 
            Launching="Application_Launching" Closing="Application_Closing" 
            Activated="Application_Activated" Deactivated="Application_Deactivated"/>
    </Application.ApplicationLifetimeObjects>

</Application>
PhoneApplicationService类所提供的是对数据的暂时存储,只有在运行的时候才能保留(独立存储空间是可以永久保留的),这个类的属性State可以设置的是字典容器,但是保存在State字典中的对象都必须是可序列化的,可序列化的意思是可以将对象转换成XML,XML也可以从中反序列化成对象

页面最后加载的方法:OnNavigatedFrom方法;获取导航目标页:e.Content 并进行强制转换;访问App类的公共属性;PhoneApplicationService.State进行暂时的保存及读取;

源码下载

windows phone 三种数据共享的方式(8)的更多相关文章

  1. mutex,thread(c++11 windows linux三种方式)

    一 c++11  windows linux三种方式 //#include <stdio.h> //#include <stdlib.h> //#include <uni ...

  2. VMware的三种网络连接方式区别

    关于VMware的三种网络连接方式,NAT,Bridged,Host-Only ,在刚接触的时候通常会遇到主机Ping不通虚拟机而虚拟机能Ping得通主机:主机与虚拟机互不相通等等网络问题.本文就这三 ...

  3. [转]详述DHCP服务器的三种IP分配方式

    DHCP就是动态主机配置协议(Dynamic Host Configuration Protocol),它的目的就是为了减轻TCP/IP网络的规划.管理和维护的负担,解决IP地址空间缺乏问题.这种网络 ...

  4. .NET中的三种接口实现方式

    摘自:http://www.cnblogs.com/zhangronghua/archive/2009/11/25/1610713.html 一般来说.NET提供了三种不同的接口实现方式,分别为隐式接 ...

  5. Apache Spark探秘:三种分布式部署方式比较

    转自:链接地址: http://dongxicheng.org/framework-on-yarn/apache-spark-comparing-three-deploying-ways/     目 ...

  6. Binding 中 Elementname,Source,RelativeSource 三种绑定的方式

    在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到过的问题做下汇总记录和理解. 1. so ...

  7. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十二 || 三种跨域方式比较,DTOs(数据传输对象)初探

    更新反馈 1.博友@落幕残情童鞋说到了,Nginx反向代理实现跨域,因为我目前还没有使用到,给忽略了,这次记录下,为下次补充.此坑已填 2.提示:跨域的姊妹篇——<三十三║ ⅖ 种方法实现完美跨 ...

  8. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress(转发)

    原文 http://cloud.51cto.com/art/201804/570386.htm Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress 最近 ...

  9. 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程

    一.依赖注入DI 学习目标1)搞清楚构造参数依赖注入的过程及类2)搞清楚注解方式的属性依赖注入在哪里完成的.学习思路1)思考我们手写时是如何做的2)读 spring 源码对比看它的实现3)Spring ...

随机推荐

  1. 怎样使用CMenu类

    CMenu类从CObject类派生而来.为什么要使用CMenu类呢?AppWzard不是把菜单做好了吗?在资源编辑器上修改菜单不是很方便吗?     我是个vc++初学者,自从当斑竹以来,天天看贴子, ...

  2. 数独问题的介绍及POJ 2676-Sudoku(dfs+剪枝)

    知道是数独问题后犹豫了一下要不要做(好像很难的样纸==.),用dfs并剪枝,是一道挺规范的搜索题. 先介绍以下数独吧- 数独(Sudoku)是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上 ...

  3. OCA读书笔记(7) - 管理数据库存储结构

    7.Managing Database Storage Structures 逻辑结构 数据库的存储结构有物理结构和逻辑结构组成的 物理结构:物理上,oracle是由一些操作系统文件组成的 SQL&g ...

  4. Qt4在linux下的安装

    1.下载SDK ftp://ftp.informatik.hu-berlin.de/pub/Mirrors/ftp.troll.no/QT/qtsdk/qt-sdk-linux-x86-opensou ...

  5. uva 10602 Editor Nottoobad(排序)

    题目连接:10602 Editor Nottoobad 题目大意:要输入n个单词,现在有三种操作, 1.输入一个字符,需要按下一次按键.  2.通过声控删除一个字符.3.通过声控复制一遍上面的单词.现 ...

  6. Delphi中获取Unix时间戳及注意事项(c语言中time()是按格林威治时间计算的,比北京时间多了8小时)

    uses DateUtils;DateTimeToUnix(Now) 可以转换到unix时间,但是注意的是,它得到的时间比c语言中time()得到的时间大了8*60*60这是因为Now是当前时区的时间 ...

  7. flex网上办(苹果)桌面系统仿真

    1.有登录界面 2.能够载入app(每一个app是单独的swf),并可拖动app的图标互相叠加 3.桌面上显示的哪些APP与目录是依据登陆的用户信息.从webservice中读取的(名字.图标信息等) ...

  8. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  9. OCA读书笔记(14) - 备份和恢复基本概念

    备份恢复概念 如何判断数据库的一致性 在mount状态下,oracle如何判断数据库的一致性 scn:system change number,它是数据库时钟 如何查询当前系统的scn: select ...

  10. hdu1495之经典搜索

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...