设为首页 收藏本站
查看: 1087|回复: 0

Windows Phone 7 开发探索笔记6——页面间传值

[复制链接]

尚未签到

发表于 2015-5-8 09:54:48 | 显示全部楼层 |阅读模式
  上篇文章中介绍了如何进行页面间导航(跳转)操作,本文来说说页面间的传值操作。在页面间导航时传递参数的方式大致有3种,QueryString,全局变量和独立存储。独立存储还可用于在一个程序的多次执行中共享变量,我会在介绍独立存储的文章中说明。本文只介绍前两种传值方式。
  一.QueryString方式
  我沿用了上篇文章中的演示程序,去掉了页面1中的HyperlinkButton,并在页面2中添加一个文本框用以呈现数据。如下图:
   DSC0000.jpg DSC0001.jpg
  我在页面1中的Button事件处理程序中添加了如下代码:

DSC0002.gif DSC0003.gif 代码

private void btnMain_Click(object sender, RoutedEventArgs e)
{
     string target = "/SubPage.xaml";
     target += string.Format("?InputText={0}", txtInput.Text);
     this.NavigationService.Navigate(new Uri(target, UriKind.Relative));
}
  程序运行时这个Uri是这样的:”/SubPage.xaml?InputText=Hello, Windows Phone 7!” 它的形式和HTML中的查询字符串(Query String)一样,如果要传递多个参数,可以用&来合并,例如:”/SubPage.xaml?InputText=Hello, Windows Phone 7!&Name=Zhang Yin”。  
页面2中Button的Click事件处理程序代码如下:


private void btnBack_Click(object sender, RoutedEventArgs e)
{
     if (this.NavigationService.CanGoBack)
         this.NavigationService.GoBack();
}
  并且我在页面2中重写了OnNavigatedTo方法。OnNavigatedTo方法是定义在Page类中的,所以PhoneApplicationPage也继承了此方法,它是一个Virtual方法,所以需要用override关键字重写。OnNavigatedTo在页面被创建后马上会被调用,也就是说在OnNavigatedTo 方法被调用时,页面的构造函数已经执行完毕了。类似的还有OnNavigatedFrom方法,它是在离开当前页面时触发的。
  页面2中OnNavigatedTo方法内的代码如下:

代码

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

代码

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            string value = string.Empty;
            IDictionary queryString = this.NavigationContext.QueryString;
            queryString.TryGetValue("InputText", out value);
            if (value != null)
            {
                txt.Text = value;
            }
            base.OnNavigatedTo(e);
        }  效果如下:  
DSC0004.jpg DSC0005.jpg
  

    通过QueryString虽然可以向一个页面传递参数,但却无法回传数据,例如我在页面2中将文本修改为“Windows Phone 7!”,然后点击“前往第1页”按钮,得到的还是初始的那个页面,如下图:
    
       DSC0006.jpg DSC0007.jpg
  要解决这个问题,就需要使用全局变量了。
  二.全局变量
  对于全局变量来说,我们可以在项目中添加一个在整个程序生命周期中都能访问到的类,将相应的数据保存在这个类的属性里。不过现在我们不用自己动手做这些额外的工作了。项目中本身就有一个类满足这个需求:App类。  App 类继承自Application类。通过Application的Current属性就可以获取到与当前程序关联的Application类实例,然后通 过转换就可以得到App类实例。程序中所有的页面都可以访问到这个App类,所以将我们要保存的数据放到App类中是最好不过了,免去了自己实现的麻烦。在App类中添加一个公有的InputText属性(C# 3.0的自动属性) :

    


public partial class App : Application
{
     public string InputText { get; set; }
     ……
}
  页面1中的代码如下:

代码

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            App app = Application.Current as App;
            if (app.InputText != null)
                txtPage1.Text = app.InputText;
            base.OnNavigatedTo(e);
        }
        protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            App app = Application.Current as App;
            app.InputText = txtPage1.Text;
            base.OnNavigatedFrom(e);
        }  我在OnNavigatedTo方法内,读取App类的InputText值,为的是当在页面2中修改了文本后可以反映到页面1中。注意:OnNavigatedTo方法是在当前页面被激活(成为活动页面)时调用的。在OnNavigatedFrom方法中将文本框赋给App类的InputText属性,供页面2去读取。
  页面2中的代码如下:

代码

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            App app = Application.Current as App;
            if (app.InputText != null)
                txtPage2.Text = app.InputText;
            base.OnNavigatedTo(e);
        }
        protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            App app = Application.Current as App;
            app.InputText = txtPage2.Text;
            base.OnNavigatedFrom(e);
        }  页面2中的操作与页面1类似。这样,当我们再次将页面2中的文本修改为“Windows Phone 7!”,然后点击“前往第1页”按钮时,就可以得到想要的结果了:
DSC0008.jpg DSC0009.jpg
    三.PhoneApplicationService类
  类似于App类,我们还可以将要在多个页面中访问的数据保存在PhoneApplicationService的State属性中。它的类型是IDictionary,所以我们可以保存任意对象,不过前提是这个对象是可序列化的(serializable)。在程序中,我们无需自己创建PhoneApplicationService的实例,通过PhoneApplicationService的静态属性Current就可以获取到已有的PhoneApplicationService实例。注意:在程序中访问PhoneApplicationService类需要添加下面的名称空间:
  

using Microsoft.Phone.Shell;  程序代码如下,页面1中的代码如下:

代码

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            if (PhoneApplicationService.Current.State.ContainsKey("InputText"))
            {
                txtPage1.Text = PhoneApplicationService.Current.State["InputText"] as string;
            }
            base.OnNavigatedTo(e);
        }
        protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            PhoneApplicationService.Current.State["InputText"] = txtPage1.Text;
            base.OnNavigatedFrom(e);
        }  页面2中的代码如下:

代码

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            if (PhoneApplicationService.Current.State.ContainsKey("InputText"))
            {
                txtPage2.Text = PhoneApplicationService.Current.State["InputText"] as string;
            }
            base.OnNavigatedTo(e);
        }
        protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            PhoneApplicationService.Current.State["InputText"] = txtPage2.Text;
            base.OnNavigatedFrom(e);
        }  四.关于OnNavigatedTo和OnNavigatedFrom方法
  我觉得这两个方法的名字起的不太好,有时候容易混淆,如果把OnNavigatedTo改为OnNavigatedToThisPageFromOther,把OnNavigatedFrom改为OnNavigatedFromThisPageToOther就会很清晰了,当然这只是帮助我们记忆的一种方法了。下面是MSDN中对这两个方法的一些建议:
  OnNavigatedTo:重写 OnNavigatedTo 方法以检查导航请求并且准备供显示的页面。例如,可以加载请求的数据并且启用或禁用可视化元素。通常是使用 OnNavigatedTo 方法,而非为Loaded事件创建事件处理程序。最好使用 OnNavigatedTo 方法,因为只在每次页面成为活动页面时调用该方法一次。Silverlight 框架在每次将元素添加到可视化树时引发Loaded事件,在激活某一页面时该事件可能会多次发生。
  OnNavigatedFrom:重写 OnNavigatedFrom 方法以便在页面成为非活动时对该页面执行最后的操作。例如,可以更新与该页面相关的数据。通常是使用 OnNavigatedFrom 方法,而非为Navigated事件创建事件处理程序。最好使用 OnNavigatedFrom 方法,因为不必再从 NavigationService 对象移除事件处理程序以避免对象生存期问题。
  五.下载示例代码:
  WindowsPhonePassingDataDemo.zip
  如果大家喜欢我的文章,请点击“推荐”,谢谢!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-64887-1-1.html 上篇帖子: Windows Phone 7屏幕分辨率之争 下篇帖子: Windows Phone 7 开发探索笔记2——触控操作之Manipulation
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表