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 ...
随机推荐
- 基于FPGA的key button等开关消抖,按键消抖电路设计
最近要用上一个key消抖的功能.于是找到了之前写的并放入博客的程序,发现居然全部有问题.http://www.cnblogs.com/sepeng/p/3477215.html —— 有问题,包括很多 ...
- 2_Cat Years
2 // // ViewController.swift // Cat Years // // Created by ZC on 16/1/6. // Copyright © 2016年 ZC. Al ...
- 在VC6中基于dll开发插件用于各种图片显示(BMP/TGA/JPG/GIF/PNG/TIF/ICO/WMF/EMF/...)
一.图片显示 图片显示的方法: 1. 直接写程序 2. 第3方库 3. 调用COM组件的IPicture接口 4. 使用MFC的CPictureHolder类 5. 使用GDI+的CImag ...
- Mac 让 iTerm2 记住用户名密码 expect 脚本
刚刚用iTerm2的时候,总是要一遍遍的敲用户名.密码. 我在想, 能不能像Windows的软件一样,可以直接让软件记住.然后只要点击一下,就直接ssh到远程服务器上面去了. 之后经过搜索,可以用ex ...
- ActionBarSherlock学习笔记 第一篇——部署
ActionBarSherlock学习笔记 第一篇--部署 ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android ...
- JAVA GUI学习 - JMenuBar菜单条、JMenu菜单、JMenuItem菜单项组件学习
public class MenuBarKnow extends JFrame { JMenuBar jMenuBar; JMenu jMenuFile,jMenuEditor,jMenuAbout; ...
- phantompy — phantompy 0.10 documentation
phantompy - phantompy 0.10 documentation phantompy¶ Release v0.10. phantompy is a BSD Li ...
- FastReport配置打印预览button_C++
如需转载请标明出处:http://blog.csdn.net/itas109 FastReport採用C++方式.配置打印预览选项 //打印预览 //配置打印预览选项 pReport->Prev ...
- hdu5188 加限制的01背包问题
http://acm.hdu.edu.cn/showproblem.php? pid=5188 Problem Description As one of the most powerful brus ...
- [译]Stairway to Integration Services Level 14 - 项目转换(SSIS 2008 ~ SSIS 2012)
介绍 本文中我们会用SSDT把第一个SSIS项目转换为 SSIS 2012, 为什么要升级到2012? 你可能想使用SSIS 2012新的特性. 又或者想使用 SSIS 2012 Catalog. 想 ...