Windows Phone 8初学者开发—第18部分:在页面间导航
原文 Windows Phone 8初学者开发—第18部分:在页面间导航
系列地址: http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners
源代码: http://aka.ms/absbeginnerdevwp8
PDF版本: http://aka.ms/absbeginnerdevwp8pdf
当某人在应用程序栏上单击麦克风图标时,我们希望将他带到一个新的页面,并在此页面中录制自定义的声音。为此,我们需要在应用程序中创建第二个页面,然后从MainPage.xaml导航到新的页面。在Windows Phone应用程序中导航与web页面间的导航类似。在本课中,我们将学习导航API,虽然在这个特定的应用程序中我们的需求很简单。
本课的计划:
- 再次讨论数据绑定项目模板以观察它如何从主页面导航到明细页面。
- 讨论Windows Phone 8 API中导航所需的类。
- 实现从主页面导航到录制自定义声音的新页面所需的代码。
1. 再次讨论数据绑定项目模板以了解导航
如果您回想一下几节课前当我们查看数据绑定项目模板时,当点击某个列表项目时我们将看到:

导航到另一个页面,其中包含给定项的更多细节:

除了MainPage.xaml,该项目模板还有一个称为DetailsPage.xaml的页面:

在MainPage.xaml.cs文件的MainLongListSelector_SelectionChanged事件处理程序中,我们看到了启用导航所需的代码。注意47-50行的代码:

NavigationService类用于从一个XAML页面导航到另一个页面。但是在更复杂的场景中,它将起到更重要的作用。因为它全权负责XAML页面间的导航,它还允许您检查导航历史(称为“后退堆栈”),从后退堆栈中删除条目,以及观察这些更改对应用程序导航的效果。
为进一步学习NavigationService类的高级功能,请参考这篇MSDN文章:
http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh394012(v=vs.105).aspx

然而在我们的例子中,我们仅需要从MainPage.xaml页面导航到一个新的页面。我们不需要担心后退页面场景,在页面间传递值等内容。如果您想做一些额外的研究,可以参考MSDN上这篇文章,它描述了有关导航的更通用的过程:
http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff626521(v=vs.105).aspx

大部分简单的导航场景通过代码示例中的Navigate()方法完成。
请注意Uri作为Navigate()方法的输入参数。Uri对象代表统一资源标示符(Uniform Resource Indicator),它与URL类似,但是有更多功能。Uri包含两个基本部分—一个代表位置的字符串和一个用于解释位置的字符串UriKind。
让我们开始解析字符串,您会发现它一部分是字符串,一部分是从LongListSelector的当前选中项检索的动态值。它们通过+运算符被追加在一起:
"/DetailsPage.xaml?selectedItem=" + MainLongListSelector.SelectedItem as ItemViewModel).ID
字符串的第一部分是显而易见的,它是我们需要导航的XAML页面。之后的所有内容,即问号?之后的字符是一个查询字符串。您以前肯定见过查询字符串,即使您不知道它的名字。查询字符串是一种发送附加信息的手段,它通常随需要被加载的页面一起发送。我说您以前肯定见过它,因为它是两种或三种主要的在无状态web页面间发送附加数据的方式之一,并且在万维网上被广泛使用。
如果您在Bing.com上搜索姓名"Clint Rutkas",浏览器的导航栏将如下所示:
http://www.bing.com/search?q=clint+rutkas&go=&qs=n&form=QBLH&pq=clint+rutkas&sc=8-9&sp=-1&sk=
从一个web页面传递信息并在另一个web页面中对它进行解释和处理是一个聪明的方式。
在我们检查的代码示例中,当某人点击LongListSelector中的一个项目时,我们希望从MainPage.xaml向DetailsPage.xaml发送选中项目的ID。?用于分隔页面名称和URL中的查询字符串。查询字符串采用名称/值对的形式。
例如:
selectedItem=3
selectedItem是名称值对的名称部分,等号后的所有内容是名称值对的值部分。
两个名称值对用一个与字符(&)分隔。我们将在本系列的稍后部分看到它被用于从一个页面向另一个页面发送纬度和经度,它的形式如下所示:
?latitude=41.8986&longitude= 87.6230
这是如何在一个字符串中发送多个值的方法。很聪明。
创建Uri的构造函数的第二个参数是类型为UriKind的枚举值。有三个可能的值:
- UriKind.Relative
- UriKind.Absolute
- UriKind.RelativeOrAbsolute
有关前两个的区别可参考以下网页:
http://msdn.microsoft.com/en-us/library/system.urikind(v=vs.95).aspx
其中包含以下内容:
“绝对URI的特点是对资源的完整引用(示例:http://www.contoso.com/index.html)”,而相对Uri取决于先前定义的基础URI(示例:/index.html)。”
在本例中,相对Uri指“相对于项目的结构”。当我们以正斜杠字符/作为Uri字符串的前缀时,我们指定了项目部署程序包的根。它与我们在解决方案资源管理器中看到的相一致。DetailsPage.xaml位于项目文件夹的根目录。当项目被部署时,那两个文件均位于程序包的根目录,就像我们以压缩文件方式打开PetSounds.xap时看到的那样。
但是UriKind.RelativeOrAbsolute又是指什么呢?这有点棘手。我所了解的情况是我们只是要求运行时自己进行判断。它将尝试清理我们提供的Uri字符串并判断出资源的位置。我想我们可以切换到UriKind.Relative,并且也能正常工作。
一旦NavigationService加载新页面DetailsPage.xaml,将触发称为OnNavigatedTo()的事件。注意事件中的代码:

在31行中,如果参数名称存在,NavigationContext.QueryString.TryGetValue("selectedItem")将检索查询字符串中名称/值对的值,并作为输出参数。接下来,selectedItem值被用来从数据模型加载正确的项,并将它设置为DetailsPage.xaml的DataContext,这样,不同的TextBlock控件可以绑定到该DataContext(第35行)。
现在我们已经看到了一个成熟的导航示例,让我们在我们自己的项目中处理这些有关导航的工作吧。
2. 创建RecordAudio.xaml页面
让我们开始创建我们希望导航到的新页面:

- 确认您位于C#文件模板部分
- 选择“Windows Phone纵向页面”
- 重命名为:RecordAudio.xaml
- 单击添加按钮
回到MainPage.xaml页面,我们将再次讨论前几节课中创建的称为RecordAudioClick()的事件处理程序:

3. 实现导航到新页面的代码
我将用以下代码替换异常处理(作为提醒):

与我们前面看到的示例相比,这里的版本被大大简化了。我们创建了一个指向新的RecordAudio.xaml页面的新的Uri对象,并使用了UriKind.RelativeOrAbsolute枚举值。
现在让我们运行应用程序并单击应用栏中的麦克风图标来测试那行代码。

如果一切顺利,我们应该看到一个缺省的页面模板,如下所示:

非常棒!在本系列的后续课程中我们将用稍微复杂一点的示例再次讨论这一概念,在那个示例中我们会在页面间传递数据。
回顾
综上所述,本课的重点是如何使用NavigationService在XAML页面间导航。我们学习了Uri对象的概念,如何指定页面的位置以及在页面间传递参数,UriKind枚举选项的含义等内容。
Windows Phone 8初学者开发—第18部分:在页面间导航的更多相关文章
- Windows Phone 8初学者开发的翻译终于过半
从2013年7月19日开始,到2013年12月9日,一共花了143天时间完成了18篇Windows Phone 8初学者开发的翻译,还剩下17篇文章需要翻译,看到了完成的希望! I love Wind ...
- Windows Phone 8初学者开发—第14部分:在运行时绑定到真实的数据
原文 Windows Phone 8初学者开发—第14部分:在运行时绑定到真实的数据 第14部分:在运行时绑定到真实的数据 原文地址: http://channel9.msdn.com/Series/ ...
- Windows Phone 8初学者开发—第13部分:设置LongListSelector中磁贴的样式
原文 Windows Phone 8初学者开发—第13部分:设置LongListSelector中磁贴的样式 第13部分:设置LongListSelector中磁贴的样式 原文地址: http://c ...
- Windows Phone 8初学者开发—第12部分:改进视图模型和示例数据
原文 Windows Phone 8初学者开发—第12部分:改进视图模型和示例数据 第12部分:改进视图模型和示例数据 原文地址:http://channel9.msdn.com/Series/Win ...
- Windows Phone 8初学者开发—第11部分:设置SounBoard应用程序
原文 Windows Phone 8初学者开发—第11部分:设置SounBoard应用程序 原文地址: http://channel9.msdn.com/Series/Windows-Phone-8- ...
- Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介
原文 Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介 原文地址: http://channel9.msdn.com/Series/Windows-Ph ...
- Windows Phone 8初学者开发—第9部分:Windows Phone 8模拟器概述
原文 Windows Phone 8初学者开发—第9部分:Windows Phone 8模拟器概述 第9部分:Windows Phone 8模拟器概述 原文地址: http://channel9.ms ...
- Windows Phone 8初学者开发—第8部分:理解编译和部署
原文 Windows Phone 8初学者开发—第8部分:理解编译和部署 第8部分:理解编译和部署 原文地址: http://channel9.msdn.com/Series/Windows-Phon ...
- Windows Phone 8初学者开发—第7部分:本地化应用程序
原文 Windows Phone 8初学者开发—第7部分:本地化应用程序 第7部分:本地化应用程序 原文地址: http://channel9.msdn.com/Series/Windows-Phon ...
随机推荐
- Python单元测试:unittest使用简介
一.概述 本文介绍python的单元测试框架unittest,这是Python自带的标准模块unittest.unittest是基于java中的流行单元测试框架junit设计的,其功能强大且灵活,对于 ...
- Ibatis入门基本语法(转) good
Ibatis入门基本语法 一个项目中在写ibatis中的sql语句时,where user_id in (#user_id_list# ), 运行时总是不行,后来上网查了查,才知道这里不该用#,而应该 ...
- Windows平台下C++插件系统实现的几个关键技术问题及其解决思路
根据我的实践,在Windows平台下设计并实现一个C++插件系统,需要解决几个关键技术问题.下面我谈谈需要解决的几个关键技术问题以及我想到的简单的解决思路.由于我主要专注于Windows平台C++程序 ...
- c++的正整数高精度加减乘除
数值计算之高精度加减乘除 一. 高精度正整数的高精度计算 1.加法 2.减法 减法和加法的最大区别在于:减法是从高位开始相减,而加法是从低位开始相加 3.乘法:用高精度加法实现 l 乘法的主 ...
- installation - How to install Synaptic Package Manager? - Ask Ubuntu
installation - How to install Synaptic Package Manager? - Ask Ubuntu How to install Synaptic Package ...
- linux 中多线程使用
/* * 对于线程之间的操作: * 一个进程中会有多个线程,各个线程之间的或向切换会付出很小的代价相比于进程之间的切换 * 为什么要引入多线程: * 1.与进程相比,他是一种非常节俭的多任务的操作方式 ...
- Chrome插件Visual Event查看Dom元素绑定事件的利器
找这工具找了好久,统一找着了,开发人员不可多得的好东东,收藏做一下分享. 用Chrome插件Visual Event查看Dom绑定的事件 Visual Event简介 Visual Event是一个开 ...
- DevExpress ASP.NET 使用经验谈(8)-ASPxGridView自定义列和基本事件
为演示本节示例,我们在原来Users表增加[性别Gender].[兴趣爱好Hobbies],[CreateTime创建时间],[ModifyTime]修改时间这4个字段, ALTER TABLE [d ...
- MD5算法【计算文件和字符串的MD5值】
1. MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错).任何长度的任意内容都可以用MD5计算出散列值.MD5的前身:MD2.MD3.MD4.介绍工具:CalcMD5 ...
- java集群
java集群 分类: java学习2011-05-12 09:12 7531人阅读 评论(9) 收藏 举报 java服务器负载均衡ejb集群数据库 序言 越来越多的关键应用运行在J2EE(Java 2 ...