windows phone页面导航可以通过两种方法进行设置:一种是直接在XAML中设置;另一种则需要通过编码在托管代码中实现。二者相同的地方是它们最终都需要使用NavigationService类,再调用Navigate方法实现导航。
最简单直接的方式,找到控件,为属性NavigateUri赋值即可,以常用的HyperlinkButton为例:
<HyperlinkButton Content="图片" Height="30" Name="lbtnPicture" Width="200" NavigateUri="/View/Pictures.xaml" />
其中,使用“/”意味着这是一个相对链接,Silverlight for Windows Phone目录层次的路径操作比较严格,如将前面的“/”去掉,编译器将报错并停止运行。
(1)、直接传入URI
void lbtnPicture_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/View/Pictures.xaml", UriKind.Relative)); }
(2)、使用地址别名
地址别名是web技术中的一项很好的扩展,windows phone开发中同样适用。可以将较长命名的URI缩短为一段较短且好记的URI来呈现,比如将/View/Pictures.xaml缩短为Pic:
void lbtnPicture_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("Pic", UriKind.Relative)); }
看到“Pic”大家会想到它一定映射到具体的某个URI(“/View/Pictures.xaml”)。如何进行映射呢?
需要在App.xaml.cs文件中额外引入UriMapper别名,映射所在的命名空间如下所示:
xmlns:navigation="clr-namespace:System.Windows.Navigation;assembly=Microsoft.Phone"
实现地址别名,是基于Microsoft.Phone链接库的,接着就是配置对应的映射关系:
<navigation:UriMapper x:Key="UriMap"> <navigation:UriMapping Uri="Pic" MappedUri="/View/Pictures.xaml" /> </navigation:UriMapper>
接着,我们要在App.xaml.cs的构造函数中获取地址别名,将地址别名的key提取到UriMapper对象中:
有过web开发经验的应该很清楚web开发中几种常见的页面参数传递方式。Silverlight for Windows Phone导航参数的传递非常类似于web开发中的get方式,也就是QueryString的方式。
下面以一个WebBrowser页面来讲解下页面间QueryString的传参方式:
//导航到浏览器页面
void btnWebBrowser_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/View/WebBrowser.xaml?uri=http://www.cnblogs.com", UriKind.Relative)); }
如果觉得参数太长,可以使用地址别名的方式:
//导航到浏览器页面
void btnWebBrowser_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("Web/http://www.cnblogs.com", UriKind.Relative)); }
相应的,App.xaml文件中UriMapper代码做出适当修改:
<!--Application Resources-->
<Application.Resources> <navigation:UriMapper x:Key="UriMap"> <navigation:UriMapping Uri="Web/{weburi}" MappedUri="/View/WebBrowser.xaml?uri={weburi}" /> </navigation:UriMapper> </Application.Resources>
其中,{weburi}变量称为参数变量,它是代替真实地址别名化后传递的参数值。
我们接着在WebBrowser.xaml页面拖拽一个WebBrowser控件和一个提示文本框控件,用于显示,xaml如下:
WebBrowser
接着在后台代码中编写:
QueryString
对于页面导航的生命周期,可通过以下事件进行跟踪:Navigating、Navigated、NavigationProgress、NavigationFailed、NavigationStopped、LoadCompleted、FragmentNavigation 。具体情况大家可以参考MSDN的讲解。
这种通过WebBrowser控件导航到具体页面的方式实际开发中会经常用到。如果需要返回到上一页,硬件设备上提供了回退按钮,实际上它是基于NavigationService的GoBack方法实现的:
void btnGoBack(object sender, RoutedEventArgs e) { NavigationService.GoBack(); }
我们可以通过BackKeyPress事件编程禁用回退功能:
CancelGoBack
a、使用“?”号区分传递参数与导航URI;
b、传递的参数之间使用“&”进行连接;
c、参数的值都只能是字符串。
QueryString传参的缺点是对于某些对象而不仅仅是字符串的传参比较难以处理。虽然我们可以通过序列化对象为字符串进行参数传递,但是序列化和反序列化消耗CPU资源,对性能要求较高的移动设备,这样的资源消耗必须是越少越好。