zoukankan      html  css  js  c++  java
  • Windows Phone 7 开发探索笔记6——页面间传值

    上篇文章中介绍了如何进行页面间导航(跳转)操作,本文来说说页面间的传值操作。在页面间导航时传递参数的方式大致有3种,QueryString,全局变量和独立存储。独立存储还可用于在一个程序的多次执行中共享变量,我会在介绍独立存储的文章中说明。本文只介绍前两种传值方式。
    一.QueryString方式

    我沿用了上篇文章中的演示程序,去掉了页面1中的HyperlinkButton,并在页面2中添加一个文本框用以呈现数据。如下图:

    我在页面1中的Button事件处理程序中添加了如下代码:

    privatevoidbtnMain_Click(objectsender,RoutedEventArgse)
    {
    string target="/SubPage.xaml";
    target+=string.Format("InputText={0}",txtInput.Text);
    this.NavigationService.Navigate(newUri(target,UriKind.Relative));
    }

    Uri是这样的:”/SubPage.xamlInputText=Hello, Windows Phone 7!” 它的形式和HTML中的查询字符串(Query String)一样,如果要传递多个参数,可以用&来合并,例如:”/SubPage.xamlInputText=Hello, Windows Phone 7!&Name=Zhang Yin”。

    页面2中Button的Click事件处理程序代码如下:


    privatevoidbtnBack_Click(objectsender,RoutedEventArgse)
    {
    if(this.NavigationService.CanGoBack)
    this.NavigationService.GoBack();
    }

    并且我在页面2中重写了OnNavigatedTo方法。OnNavigatedTo方法是定义在Page类中的,所以PhoneApplicationPage也继承了此方法,它是一个Virtual方法,所以需要用override关键字重写。OnNavigatedTo在页面被创建后马上会被调用,也就是说在OnNavigatedTo 方法被调用时,页面的构造函数已经执行完毕了。类似的还有OnNavigatedFrom方法,它是在离开当前页面时触发的。

    页面2中OnNavigatedTo方法内的代码如下:


    protectedoverridevoidOnNavigatedTo(System.Windows.Navigation.NavigationEventArgse)
    {
    stringvalue=string.Empty;
    IDictionary<string,string>queryString=this.NavigationContext.QueryString;
    if(queryString.ContainsKey("InputText"))
    {
    txt.Text=queryString["InputText"];
    }
    base.OnNavigatedTo(e);
    }

    Page类定义了一个类型为NavigationContext的NavigationContext属性,它包含一个类型为IDictionary<string, string>的QueryString属性。判空检测后,将InputText键对应的值赋给文本框的Text属性。最后触发基类的OnNavigatedTo方法以保证基类的功能正常。当然也可以使用下面的代码,效果是一样的:
    protectedoverridevoidOnNavigatedTo(System.Windows.Navigation.NavigationEventArgse)
    {
    stringvalue=string.Empty;
    IDictionary<string,string>queryString=this.NavigationContext.QueryString;
    queryString.TryGetValue("InputText",outvalue);
    if(value!=null)
    {
    txt.Text=value;
    }
    base.OnNavigatedTo(e);
    }

    通过QueryString虽然可以向一个页面传递参数,但却无法回传数据,例如我在页面2中将文本修改为“Windows Phone 7!”,然后点击“前往第1页”按钮,得到的还是初始的那个页面,如下图:
     

    二.全局变量


    对于全局变量来说,我们可以在项目中添加一个在整个程序生命周期中都能访问到的类,将相应的数据保存在这个类的属性里。不过现在我们不用自己动手做这些额外的工作了。项目中本身就有一个类满足这个需求:App类。 App 类继承自Application类。通过Application的Current属性就可以获取到与当前程序关联的Application类实例,然后通 过转换就可以得到App类实例。程序中所有的页面都可以访问到这个App类,所以将我们要保存的数据放到App类中是最好不过了,免去了自己实现的麻烦。在App类中添加一个公有的InputText属性(C# 3.0的自动属性) :

  • 相关阅读:
    康复计划
    Leetcode 08.02 迷路的机器人 缓存加回溯
    Leetcode 38 外观数列
    Leetcode 801 使序列递增的最小交换次数
    Leetcode 1143 最长公共子序列
    Leetcode 11 盛水最多的容器 贪心算法
    Leetcode 1186 删除一次得到子数组最大和
    Leetcode 300 最长上升子序列
    Leetcode95 不同的二叉搜索树II 精致的分治
    Leetcode 1367 二叉树中的列表 DFS
  • 原文地址:https://www.cnblogs.com/xingchen/p/1971772.html
Copyright © 2011-2022 走看看