原文 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枚举选项的含义等内容。

Windows Phone 8初学者开发—第18部分:在页面间导航的更多相关文章

  1. Windows Phone 8初学者开发的翻译终于过半

    从2013年7月19日开始,到2013年12月9日,一共花了143天时间完成了18篇Windows Phone 8初学者开发的翻译,还剩下17篇文章需要翻译,看到了完成的希望! I love Wind ...

  2. Windows Phone 8初学者开发—第14部分:在运行时绑定到真实的数据

    原文 Windows Phone 8初学者开发—第14部分:在运行时绑定到真实的数据 第14部分:在运行时绑定到真实的数据 原文地址: http://channel9.msdn.com/Series/ ...

  3. Windows Phone 8初学者开发—第13部分:设置LongListSelector中磁贴的样式

    原文 Windows Phone 8初学者开发—第13部分:设置LongListSelector中磁贴的样式 第13部分:设置LongListSelector中磁贴的样式 原文地址: http://c ...

  4. Windows Phone 8初学者开发—第12部分:改进视图模型和示例数据

    原文 Windows Phone 8初学者开发—第12部分:改进视图模型和示例数据 第12部分:改进视图模型和示例数据 原文地址:http://channel9.msdn.com/Series/Win ...

  5. Windows Phone 8初学者开发—第11部分:设置SounBoard应用程序

    原文 Windows Phone 8初学者开发—第11部分:设置SounBoard应用程序 原文地址: http://channel9.msdn.com/Series/Windows-Phone-8- ...

  6. Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介

    原文 Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介 原文地址: http://channel9.msdn.com/Series/Windows-Ph ...

  7. Windows Phone 8初学者开发—第9部分:Windows Phone 8模拟器概述

    原文 Windows Phone 8初学者开发—第9部分:Windows Phone 8模拟器概述 第9部分:Windows Phone 8模拟器概述 原文地址: http://channel9.ms ...

  8. Windows Phone 8初学者开发—第8部分:理解编译和部署

    原文 Windows Phone 8初学者开发—第8部分:理解编译和部署 第8部分:理解编译和部署 原文地址: http://channel9.msdn.com/Series/Windows-Phon ...

  9. Windows Phone 8初学者开发—第7部分:本地化应用程序

    原文 Windows Phone 8初学者开发—第7部分:本地化应用程序 第7部分:本地化应用程序 原文地址: http://channel9.msdn.com/Series/Windows-Phon ...

随机推荐

  1. Delphi中的内存对齐 与 Packed关键字

    以delphi为例:TTest = recordc1: char;i1: Integer;c2: char;c3: Char;end;这个结构如果用sizeof取其占用的内存大小,是多少呢,是1+4+ ...

  2. Spring Boot Admin Reference Guide

    1. What is Spring Boot Admin? Spring Boot Admin is a simple application to manage and monitor your S ...

  3. Oracle 存储过程DEMO

    );   cursor isbns is select ISBN,id from librarys;   bn isbns%rowtype;   begin  for bn in isbns  loo ...

  4. hdoj 3478 Catch(二分图判定+并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 思路分析:该问题需要求是否存在某一个时刻,thief可能存在图中没一个点:将该问题转换为图论问题 ...

  5. c语言实现tree数据结构

    该代码实现了tree的结构.依赖dyArray数据结构.有first一级文件夹.second二级文件夹. dyArray的c实现參考这里点击打开链接  hashTable的c实现參考这里点击打开链接 ...

  6. Android Activity和Intent机制学习笔记

    转自 http://www.cnblogs.com/feisky: Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具 ...

  7. Nginx 之二: nginx.conf 配置及基本优化

    一:常用功能优化: 1:网络连接的优化: 只能在events模块设置,用于防止在同一一个时刻只有一个请求的情况下,出现多个睡眠进程会被唤醒但只能有一个进程可获得请求的尴尬,如果不优化,在多进程的ngi ...

  8. Python之路Day17

    算法:冒泡排序.插入排序.快速排序.堆排序 冒泡排序 #! /usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "Q1mi& ...

  9. linux 下dd命令直接清除分区表(不用再fdisk一个一个的删除啦)

    分区表是硬盘的分区信息,要删除一个硬盘的所有分区表很麻烦的,需要fdisk一个一个的删除,其实dd命令可直接清除分区信息,当然,这也是linux给root用户留下的作死方法之一.dd 命令主要参数如下 ...

  10. Iframe知识点

    var oIframe=document.getElementById('iframe1'); 获取iframe对象:   oIframe.contentWindow.//  iframe 里的win ...