Windows Phone 7 开发探索笔记5——页面间导航
本文将介绍如何在silverlight for windows phone中进行页面间导航(跳转)操作。
一.navigationservice类
页面间的导航操作需要通过navigationservice类来实现。首先来看演示程序的xaml代码和截图(我在项目中添加了一个页面):
页面1的xaml:
<grid x:name="contentpanel" grid.row="1" margin="12,0,12,0">
<stackpanel verticalalignment="center">
<textbox x:name="txtinput"></textbox>
<hyperlinkbutton x:name="hyperlinkbutton" navigateuri="/subpage.xaml" content="点此进入第2页"/>
<button x:name="btnmain" content="前往第2页" click="btnmain_click">
</button>
</stackpanel>
</grid>
页面2的xaml:
<grid x:name="contentpanel" grid.row="1" margin="12,0,12,0">
<stackpanel verticalalignment="center">
<button x:name="btnback" content="前往第1页" click="btnback_click">
</button>
</stackpanel>
</grid>
截图:
我在第1个页面中添加了一个hyperlinkbutton。hyperlinkbutton生来就是用作导航的,它有一个navigateuri属性,将这个属性设置为subpage.xaml,点击它时会自动导航到那个页面。button并没有这个属性,所以我需要在code-behind文件中添加如下代码:
this.navigationservice.navigate(new uri("/subpage.xaml", urikind.relative));
navigationservice属性是定义在page类中的,类型为navigationservice。此类型包含以下主要属性,方法和事件:
属性:
aspx">cangoback |
获取一个值,指示后退导航历史记录中是否至少有一个条目。 |
cangoforward |
获取一个值,指示前进导航历史记录中是否至少有一个条目。 |
获取当前显示的内容的统一资源标识符 (uri)。 |
|
获取或设置当前内容或要导航到的内容的统一资源标识符 (uri)。 |
方法:
|
|
导航到前进导航历史记录中的最新条目,如果前进导航时没有条目,则引发异常。 |
|
导航到统一资源标识符 (uri) 指定的内容。 |
|
停止尚未处理的异步导航。 |
事件:
在开始导航到内容片段时发生。 |
|
当找到正导航到的内容且此内容可用时发生。 |
|
在请求新导航时发生。 |
|
如果在导航到所请求的内容时出现错误,则会发生此事件。 |
|
在调用 stoploading方法时发生,或者在当前导航正在进行过程中又请求一个新导航时发生。 |
最常用的方法是navigate( )方法,它需要一个uri类的参数,所以我们需要将相应的路径封装到一个uri类中。在页面2中那个button的click事件处理程序里我添加了如下的代码:
if (this.navigationservice.cangoback)
navigationservice.goback();
首先,检测后退导航历史中是否有条目,如果在没有条目的情况下调用goback方法会引发异常,如下图(我在页面1的事件处理程序中使用了goback方法):
当然,在第2页的click事件中也可以不使用goback,而用navigate( )方法,如下:
this.navigationservice.navigate(new uri("/mainpage.xaml", urikind.relative));
但这和goback方法有本质区别。为什么这么说呢:因为无论是使用hyperlinkbutton的navigateuri属性还是navigationservice类的navigate方法,都会为要导航到的页面创建一个全新的实例并显示它,这些都是在幕后完成的,对我们来说是透明的。但goback方法是从后退导航历史中查找最近的一个页面并加载它,并没有创建实例的动作。
下面来验证一下:运行程序,在页面1中的文本框中输入一些文本
然后点击按钮导航到页面2
点击页面2中的按钮,呈现出来的页面1里面的文本框是空的。
这时如果点击2次“返回”按钮,会按下面的顺序显示
出现这种情况的原因就是因为页面2中使用了navigationservice类的navigate方法,所以在点击按钮时创建了页面1的一个全新的实例,新实例的文本框肯定是没有内容的。也就是说现在后退历史中有3个页面:初始的页面1,目标导航页面2,新生成的页面1。所以会产生上面的情景。
silverlight for windows phone中的导航系统基于一个类似栈的结构,姑且把它叫做“后退栈”。当一个发起导航请求的页面调用navigate方法时,这个页面首先会被压入后退栈,然后会创建那个目标页面并显示。当一个页面调用goback()方法或者在我们按下“返回”按钮时,当前的这个页面就会被抛弃,后退栈顶部的页面就会被弹出并显示。
二.不一样的goforward方法
silverlight for windows phone使用了与标准silverlight相同的navigationservice类和页面模型,但windows phone的文档中并没有说清楚,看似silverlight for windows phone中支持后退和前进导航,其实它并不支持前进导航。navigationservice类的cangoforward属性总是为false.在windows phone中goforward方法总会抛出异常,因为windows phone只有“后退栈”,没有“前进栈”。如果想在程序中实现向前导航的话,只能手动添加相应的按钮或菜单了。
好了,关于页面导航就说这么多,下篇文章会介绍如何在页面间传递数据。
三.下载示例代码:
作者:金山崟霸
推荐阅读
-
Windows Phone 7 开发探索笔记5——页面间导航
-
Windows Phone 7 开发 31 日谈——第2日:页面间导航
-
Windows Phone 7 开发探索笔记3——触控操作之GestureListener
-
Windows Phone笔记(7)页面间导航以及数据传递
-
Windows Phone 7 开发探索笔记4——触控操作之XNA中的Gesture
-
Windows Phone 7 开发探索笔记7——加载XML文件
-
Windows Phone 7 开发探索笔记2——触控操作之Manipulation
-
Windows Phone 7 开发探索笔记6——页面间传值
-
Windows Phone 7 开发探索笔记1——触控操作之Touch
-
Windows Phone 7 开发探索笔记9——菜单栏