Windows Phone 7 - 页面间传值

分类: Windows Phone 7 2011-01-23 20:42 441人阅读 评论(0) 收藏 举报

在页面间导航时传递参数的方式大致有3种,QueryString,全局变量和独立存储。本文只介绍前两种传值方式。

一.QueryString方式

在页面1中的Button事件处理程序中添加了如下代码:
[c-sharp] view plaincopy
  1. private void btnMain_Click(object sender, RoutedEventArgs e)
  2. {
  3. string target = "/SubPage.xaml";
  4. target += string.Format("?InputText={0}", txtInput.Text);
  5. this.NavigationService.Navigate(new Uri(target, UriKind.Relative));
  6. }
程序运行时这个Uri是这样的:”/SubPage.xaml?InputText=Hello, Windows Phone 7!” 它的形式和HTML中的查询字符串
(Query String)一样,如果要传递多个参数,可以用&来合并,例如:
”/SubPage.xaml?InputText=Hello, Windows Phone 7!&Name=Zhang Yin”。
页面2中Button的Click事件处理程序代码如下:
[c-sharp] view plaincopy
  1. private void btnBack_Click(object sender, RoutedEventArgs e)
  2. {
  3. if (this.NavigationService.CanGoBack)
  4. this.NavigationService.GoBack();
  5. }
并且我在页面2中重写了OnNavigatedTo方法。OnNavigatedTo方法是定义在Page类中的,
所以PhoneApplicationPage也继承了此方法,它是一个Virtual方法,所以需要用override关键字重写。
OnNavigatedTo在页面被创建后马上会被调用,也就是说在OnNavigatedTo 方法被调用时,页面的构造函数已经执行完毕了。
类似的还有OnNavigatedFrom方法,它是在离开当前页面时触发的。
页面2中OnNavigatedTo方法内的代码如下:
[c-sharp] view plaincopy
  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
  2. {
  3. string value = string.Empty;
  4. IDictionary<string, string> queryString = this.NavigationContext.QueryString;
  5. if (queryString.ContainsKey("InputText"))
  6. {
  7. txt.Text = queryString["InputText"];
  8. }
  9. base.OnNavigatedTo(e);
  10. }
Page类定义了一个类型为NavigationContext的NavigationContext属性,它包含一个类型为IDictionary<string, string>的
QueryString属性。判空检测后,将InputText键对应的值赋给文本框的Text属性。
最后触发基类的OnNavigatedTo方法以保证基类的功能正常。当然也可以使用下面的代码,效果是一样的:
[c-sharp] view plaincopy
  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
  2. {
  3. string value = string.Empty;
  4. IDictionary<string, string> queryString = this.NavigationContext.QueryString;
  5. queryString.TryGetValue("InputText", out value);
  6. if (value != null)
  7. {
  8. txt.Text = value;
  9. }
  10. base.OnNavigatedTo(e);
  11. }
通过QueryString虽然可以向一个页面传递参数,但却无法回传数据,例如我在页面2中将文本修改为“Windows Phone 7!”,
然后点击“前往第1页”按钮,得到的还是初始的那个页面。要解决这个问题,就需要使用全局变量了。

二.全局变量

对于全局变量来说,我们可以在项目中添加一个在整个程序生命周期中都能访问到的类,将相应的数据保存在这个类的属性里。

不过现在我们不用自己动手做这些额外的工作了。项目中本身就有一个类满足这个需求:App类。 App 类继承自Application类。

通过Application的Current属性就可以获取到与当前程序关联的Application类实例,然后通 过转换就可以得到App类实例。

程序中所有的页面都可以访问到这个App类,所以将我们要保存的数据放到App类中是最好不过了,免去了自己实现的麻烦。

在App类中添加一个公有的InputText属性(C# 3.0的自动属性) :

[c-sharp] view plaincopy
  1. public partial class App : Application
  2. {
  3. public string InputText { get; set; }
  4. ……
  5. }

页面1中的代码如下:

[c-sharp] view plaincopy
  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
  2. {
  3. App app = Application.Current as App;
  4. if (app.InputText != null)
  5. txtPage1.Text = app.InputText;
  6. base.OnNavigatedTo(e);
  7. }
  8. protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
  9. {
  10. App app = Application.Current as App;
  11. app.InputText = txtPage1.Text;
  12. base.OnNavigatedFrom(e);
  13. }

我在OnNavigatedTo方法内,读取App类的InputText值,为的是当在页面2中修改了文本后可以反映到页面1中。

注意:OnNavigatedTo方法是在当前页面被激活(成为活动页面)时调用的。

在OnNavigatedFrom方法中将文本框赋给App类的InputText属性,供页面2去读取。

页面2中的代码如下:

[c-sharp] view plaincopy
  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
  2. {
  3. App app = Application.Current as App;
  4. if (app.InputText != null)
  5. txtPage2.Text = app.InputText;
  6. base.OnNavigatedTo(e);
  7. }
  8. protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
  9. {
  10. App app = Application.Current as App;
  11. app.InputText = txtPage2.Text;
  12. base.OnNavigatedFrom(e);
  13. }

页面2中的操作与页面1类似。这样,当我们再次将页面2中的文本修改为“Windows Phone 7!”,然后点击“前往第1页”按钮时,

就可以得到想要的结果了。

三.PhoneApplicationService类

类似于App类,我们还可以将要在多个页面中访问的数据保存在PhoneApplicationService的State属性中。

它的类型是IDictionary<string, object>,所以我们可以保存任意对象,不过前提是这个对象是可序列化的(serializable)。

在程序中,我们无需自己创建的实例,通过PhoneApplicationService的静态属性Current就可以获取到已有的实例。

注意:在程序中访问PhoneApplicationService类需要添加下面的名称空间:

usingMicrosoft.Phone.Shell;

程序代码如下,页面1中的代码如下:

[c-sharp] view plaincopy
  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
  2. {
  3. if (PhoneApplicationService.Current.State.ContainsKey("InputText"))
  4. {
  5. txtPage1.Text = PhoneApplicationService.Current.State["InputText"] as string;
  6. }
  7. base.OnNavigatedTo(e);
  8. }
  9. protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
  10. {
  11. PhoneApplicationService.Current.State["InputText"] = txtPage1.Text;
  12. base.OnNavigatedFrom(e);
  13. }

页面2中的代码如下:

[c-sharp] view plaincopy
  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
  2. {
  3. if (PhoneApplicationService.Current.State.ContainsKey("InputText"))
  4. {
  5. txtPage2.Text = PhoneApplicationService.Current.State["InputText"] as string;
  6. }
  7. base.OnNavigatedTo(e);
  8. }
  9. protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
  10. {
  11. PhoneApplicationService.Current.State["InputText"] = txtPage2.Text;
  12. base.OnNavigatedFrom(e);
  13. }

四.关于OnNavigatedTo和OnNavigatedFrom方法

我觉得这两个方法的名字起的不太好,有时候容易混淆,如果把OnNavigatedTo改为OnNavigatedToThisPageFromOther,

把OnNavigatedFrom改为OnNavigatedFromThisPageToOther就会很清晰了,当然这只是帮助我们记忆的一种方法了。

下面是MSDN中对这两个方法的一些建议:

OnNavigatedTo:重写 OnNavigatedTo 方法以检查导航请求并且准备供显示的页面。

例如,可以加载请求的数据并且启用或禁用可视化元素。通常是使用 OnNavigatedTo 方法,而非为 Loaded 事件创建事件处理程序

最好使用 OnNavigatedTo 方法,因为只在每次页面成为活动页面时调用该方法一次。

Silverlight 框架在每次将元素添加到可视化树时引发 Loaded 事件,在激活某一页面时该事件可能会多次发生。

OnNavigatedFrom:重写 OnNavigatedFrom 方法以便在页面成为非活动时对该页面执行最后的操作。

例如,可以更新与该页面相关的数据。通常是使用 OnNavigatedFrom 方法,而非为 Navigated 事件创建事件处理程序

最好使用 OnNavigatedFrom 方法,因为不必再从 NavigationService 对象移除事件处理程序以避免对象生存期问题。

转载于:https://www.cnblogs.com/songtzu/archive/2012/04/11/2442069.html

Windows Phone 7 - 页面间传值 来源-http://blog.csdn.net/dncts/article/details/6160067相关推荐

  1. Windows Phone开发(7):当好总舵主 转:http://blog.csdn.net/tcjiaan/article/details/7281421...

    吹完了页面有关的话题,今天我们来聊一下页面之间是如何导航的,在更多情况下,我们的应用程序不会只有一个页面的,应该会有N个,就像我们做桌面应 用开发那样,我们一个应用程序中可能不止一个窗体(极简单的程序 ...

  2. [转]Windows Shell 编程 第十一章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987992】...

    第十一章 探索Shell 我们现在将注意力从API转向Windows Shell本身.从这一章往后,我们的目标主要集中在清晰和全面的揭示探测器的工作原理和Shell 命名空间的构成对象上,最后给出客户 ...

  3. [转]Windows Shell 编程 第十三章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988004】...

    第十三章 Windows脚本环境 现在的许多开发人员以前都是在MS-DOS环境下编程的.几乎所有人都接触过批处理文件--一种基于文本命令的文件.这种文件使你能够在一个可执行命令中组合多个指令.批处理文 ...

  4. [转]Windows Shell 编程 第十四章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988010】...

    第十四章 设计Shell集成应用 有一些工具可以使应用程序更紧密地与Shell和底层系统进行集成.也就是说,用户可以象处理系统文档和程序那样处理你的文档和程序.例如,右击文件来显示可用功能列表等.Wi ...

  5. [转]第一章 Windows Shell是什么 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987862】...

    一个操作系统外壳的不错的定义是它是一个系统提供的用户界面,它允许用户执行公共的任务,如访问文件系统,导出执行程序,改变系统设置等.MS-DOS有一个Command.COM扮演着这个角色.然而Windo ...

  6. Windows Shell 编程 第六章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987951】...

    第六章 快捷方式的最短路径 Windows Shell允许存储任何对象的引用到系统范围内的任何地点.例如,当你从一个文件夹拖拽可执行程序到另一个文件夹时,鼠标自动改变形状给出除拷贝和移动文件之外的第三 ...

  7. [转]Windows Shell编程 第十五章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988016】...

    第十五章 SHELL扩展 谈到Windows Shell编程,Shell扩展是最重要的科目之一,绝大多数商业应用的最酷特征的都是通过Shell扩展实现的,而且有许多显著的系统特征实际都是插入了扩展代码 ...

  8. [转]Windows Shell 编程 第八章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987961】...

    第八章 程序执行器 在Windows95以后,文档的概念得到了进一步增强.这隐含地说,文档不仅仅是ASCII文档,也不仅仅是Word或Excel文件,'文档'在这里的意思是更广泛的对象,它是系统命名空 ...

  9. Windows Phone开发(39):漫谈关键帧动画上篇 转:http://blog.csdn.net/tcjiaan/article/details/7550506...

    尽管前面介绍的几种动画会让觉得很好玩了,但是,不知道你是否发现,在前面说到的一系列XXXAnimation中,都有一个共同点,那就是仅仅针对两个值的目标值之间产生动画,如果使用By,将在原值和加上By ...

最新文章

  1. 常见损失函数和评价指标总结
  2. IT人的“钱”景以及收入的两道坎
  3. 基于PyQt5的快速开发框架QFramer
  4. 算法----单词拆分
  5. okhttp上传图片和其他参数_Android中Okhttp3实现上传多张图片同时传递参数_放手_前端开发者...
  6. kite 使用 go_使用Apache Storm和Kite SDK Morphlines的可配置ETL处理
  7. 图形学基础|深度缓冲(DepthBuffer)
  8. 全DIY主题+小工具 正版Win7桌面新体验windows7旗舰版主
  9. 2022年通用航空行业研究报告
  10. php amp 转义,HTML转义和反转义
  11. 【OpenCV】之LUT函数
  12. 【科学文献计量】中英文文献标题及摘要可读性指标分析与可视化
  13. verilog将100mhz分频为1hz_verilog—分频器设计
  14. 代谢组学分析平台都有什么仪器?
  15. Android 截屏到桌面的最佳处理方案-无须ROOT-适用Android 8.0
  16. 获取dingding审批实例
  17. 实现:您必须使用微信内置浏览器访问本页面! 的功能
  18. 超越图灵测试:判断机器是否在思考的现代方法
  19. 解决 Python Matplotlib 绘图时不连续x轴自动补全的问题(xsticks)
  20. AD17 PCB批量修改器件标号丝印

热门文章

  1. Nginx 代理服务的配置说明
  2. AOP面向切面编程相关术语介绍
  3. 学会python的基础操作题_第3章 Python基础-文件操作函数 文件操作 练习题
  4. 装配图中齿轮的画法_春季高考机械专业中机械制图考什么?重点是什么?
  5. Linux UOS(国产统信)系统下Qt无法打印日志的问题
  6. linux菜鸟入门-1
  7. STL6大标准库的关系和作用
  8. 什么是堆,栈,内存泄漏和内存溢出?
  9. 八大基本数据类型对应的八大包装类(含对应面试题解析)
  10. Linux C :线程操作和线程同步的多线程并发编程