Windows Phone 8初学者开发—第18部分:在页面间导航

原文 Windows Phone 8初学者开发—第18部分:在页面间导航

原文地址:  http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Part-18-Navigating-Between-Pages

系列地址: 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,虽然在这个特定的应用程序中我们的需求很简单。

本课的计划:

  1. 再次讨论数据绑定项目模板以观察它如何从主页面导航到明细页面。
  2. 讨论Windows Phone 8 API中导航所需的类。
  3. 实现从主页面导航到录制自定义声音的新页面所需的代码。

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页面

让我们开始创建我们希望导航到的新页面:

  1. 确认您位于C#文件模板部分
  2. 选择“Windows Phone纵向页面”
  3. 重命名为:RecordAudio.xaml
  4. 单击添加按钮

回到MainPage.xaml页面,我们将再次讨论前几节课中创建的称为RecordAudioClick()的事件处理程序:

3. 实现导航到新页面的代码

我将用以下代码替换异常处理(作为提醒):

与我们前面看到的示例相比,这里的版本被大大简化了。我们创建了一个指向新的RecordAudio.xaml页面的新的Uri对象,并使用了UriKind.RelativeOrAbsolute枚举值。

现在让我们运行应用程序并单击应用栏中的麦克风图标来测试那行代码。

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

 非常棒!在本系列的后续课程中我们将用稍微复杂一点的示例再次讨论这一概念,在那个示例中我们会在页面间传递数据。

回顾

综上所述,本课的重点是如何使用NavigationService在XAML页面间导航。我们学习了Uri对象的概念,如何指定页面的位置以及在页面间传递参数,UriKind枚举选项的含义等内容。

posted on 2013-12-12 22:24 NET未来之路 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3472142.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值