• 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的自动属性) :

  • 相关阅读:
    观察者模式
    Java中关于HashMap源码的研究
    抽象工厂模式
    适配器模式
    oracle创建表空间并赋予权限
    外观模式
    oracle中循环读出一个表的信息插入到另外一个表中
    javaScript对金额处理的方式
    装饰器模式
    建造者模式
  • 原文地址:https://www.cnblogs.com/xingchen/p/1971772.html
Copyright © 2020-2023  润新知