原文 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. GC算法之串行并行并发

    串行收集器: 用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高.但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器.当然,此收集器也可以用在小数据量(100M左右)情况下的多 ...

  2. 射频识别技术漫谈(20)——RC系列射频接口芯片

    目前基于13.56MHz的射频识别技术主要有ISO14443A.ISO14443B.ISO15693和FELICA技术.针对13.56MHz的射频识别技术,NXP开发了一系列名字以RC(Radio C ...

  3. ISO/IEC14443和15693的对比有何具体区别

    ISO14443 ISO14443A/B:超短距离智慧卡标准.这标准订出读取距离7-15厘米的短距离非接触智慧卡的功能及运作标准,使用的频率为13.56MHz.     ISO14443定义了TYPE ...

  4. JetBrains IntelliJ IDEA for Mac 15.0 破解版 – Mac 上强大的 Java 集成开发工具

    应网友要求更新. IntelliJ IDEA 是最强大的 Java IDE 之一,由知名的Jetbrainsg公司出品,最新版本增加了大量强大易用的特性,比如 Java 8 的Lambda 表达式调试 ...

  5. APUE学习之---------------进程

    离职了,交接期也有足够的时间了,可以在好好的再看一下APUE,想想上次详细的看还是在两年之前,虽然中间也偶尔会翻出来看看,但是由于工作上交集相对比较少一直没有去细读一下.现在正好是一段空挡期可以好好看 ...

  6. ACM—循环小数转变成分数知识点_C++实现

    在小学的时候,我们的学生都能把“整数表示成分母是1的分数”,而且大多数学生也都能把有限小数和循环小数表示成分数的形式.这样,整数.分数.有限小数.循环小数都属于有理数.教科书中说“整数和分数统称有理数 ...

  7. 2014多校3 Wow! Such Sequence!段树

    主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=4893 这个问题还真是纠结啊--好久不写线段树的题了.由于这几天学伸展树.然后认为线段树小case了. ...

  8. jQuery也能舞出绚丽的界面(完结篇)

    ThematicMap又增加了两种Chart类型,现在总算是齐全了,效果也出来了,与大家分享一下: 1.MultiSelect选择界面: 颜色框是可以选择颜色的: 2.生成的饼图效果: 3.生成的柱状 ...

  9. 关于移动端 rem 布局的一些总结

    [资源一]基础知识恕不回顾 基础知识参考以下两篇博客: http://isux.tencent.com/web-app-rem.html http://www.w3cplus.com/css3/def ...

  10. 在Windows Server 2008 R2 中架设 SMTP 服务器

    安装SMTP服务器 Step 1 在功能里面勾选SMTP 服务器,一路下一步完成安装 Step 2 在IIS6的SMTP属性里面的访问标签点击连接,然后设置本机可访问. (其实可以不用设置) Step ...