设为首页 收藏本站
查看: 966|回复: 0

Windows Phone 7页面导航的方法

[复制链接]

尚未签到

发表于 2015-5-12 08:38:19 | 显示全部楼层 |阅读模式
  Windows Phone 7页面导航的方法
  在继承PhoneApplicationPage的类中可以使用NavigationService提供的导航方法Navigate,即代码如下:
  this.NavigationService.Navigate(new Uri("/newPageName.xaml ", UriKind.Relative));
  注意第二个参数是UriKind.Relative
  NavigationService.Navigate Method
  Navigates to the content specified by the uniform resource identifier (URI).
  Namespace: System.Windows.Navigation
  Assembly: Microsoft.Phone (in Microsoft.Phone.dll)
  
DSC0000.jpg   Syntax
  
  
DSC0001.jpg   
  public bool Navigate(
  Uri source
  )
  Parameters
  source
  Type: System.Uri
  The URI of the content to navigate to.
  Return Value
  Type: System.Boolean
  Returns Boolean. True if the navigation started successfully; otherwise, false.
  示例说明
  我们以MainPage中点击鼠标跳转到另一个页面为例说明
  在MainPage中添加button按钮
  
DSC0002.jpg   
  添加鼠标响应
  鼠标选中Button,然后点击右键选择属性"Properties",在"Events"中添加鼠标单击Click事件,名称为"button1_Click"
  
DSC0003.jpg   
  在鼠标响应事件private void button1_Click(object sender, RoutedEventArgs e)中添加如下代码:
  this.NavigationService.Navigate(new Uri("/Page1.xaml?name=aaaa", UriKind.Relative));
  此方法实现页面跳转到Page1,并将值aaaa传递给name。
  页面导航异常时的情况
  完美的页面导航,但是有趣的事情才刚刚开始。如果上例中跳转的目标页面Page1不存在会发生什么事情呢,我们尝试一下将上面的代码修改为:
  this.NavigationService.Navigate(new Uri("/Page111.xaml?name=aaaa", UriKind.Relative));
  首先声明Page111页面并不存在,点击Button后程序没有错误提示,而是直接退出,预想与结果出现偏差。
  如果我们的程序中页面动态生成,而在程序跳转时页面生成失败或者未生成,那我们的跳转结果就是程序退出,我们想要的结果是跳转到错误提示页面或者默认页面。
  页面导航异常处理
  下面我们就来考虑如何进行页面跳转失败的异常处理。
  1. 考虑使用NavigationService.Navigate的返回值来判断跳转成功与否
  将上例的代码修改如下:

private void button1_Click(object sender, RoutedEventArgs e)
{
bool bTrans = this.NavigationService.Navigate(new Uri("/Page111.xaml?name=aaaa",UriKind.Relative));
if (!bTrans)
{
this.NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
}
}  单步调试发现,NavigationService.Navigate导航到不存在页面Page111.xaml时,其返回值也为True。
  据此了解,通过返回值判断跳转是否成功的方法不可取。仔细看看上一节中Navigate返回值的说明:True if the navigation started successfully。明白了,原来Navigation启动成功了,其返回值即为True,只是没有找到Page而已。
  2. 考虑是捕获NavigationService.NavigationFailed Event处理页面跳转异常的处理
  PhoneApplicationPage Members没有包含NavigationFailed事件处理,因此使用PhoneApplicationFrame Members的NavigationFailed事件处理。
  本例中在App.xaml.cs中找到RootFrame_NavigationFailed方法,此方法就是本例中PhoneApplicationFrame捕获NavigationService.NavigationFailed Event处理页面跳转异常的处理。
  RootFrame是Windows Phone 7--Silverlight应用程序的根窗体(Frame),在此根窗体下silverlight的Page页被调用。
  RootFrame被定义在App.xaml.cs中,如图
  
DSC0004.jpg   
  原来的代码如下:

// Code to execute if a navigation fails
private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
if (System.Diagnostics.Debugger.IsAttached)
{
// A navigation has failed; break into the debugger
System.Diagnostics.Debugger.Break();
}
}
修改为:
// Code to execute if a navigation fails
private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
if (System.Diagnostics.Debugger.IsAttached)
{
// A navigation has failed; break into the debugger
System.Diagnostics.Debugger.Break();
}

e.Handled = true;

if (RootFrame.CanGoBack)
{
RootFrame.GoBack();
}
else
{
RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
}
}  Debug时发现还是不停执行System.Diagnostics.Debugger.Break();
  困惑!!!难道RootFrame找不到MainPage.xaml,那么尝试修改Uri指定的地址;
  
  
  3. 修改Uri指定的地址
  将RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));修改为
  RootFrame.Navigate(new System.Uri("/Demo;component/MainPage.xaml", System.UriKind.Relative));
  即将RootFrame_NavigationFailed的处理方法修改如下:

// Code to execute if a navigation fails
private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
if (System.Diagnostics.Debugger.IsAttached)
{
// A navigation has failed; break into the debugger
System.Diagnostics.Debugger.Break();
}

e.Handled = true;

if (RootFrame.CanGoBack)
{
RootFrame.GoBack();
}
else
{
RootFrame.Navigate(new System.Uri("/Demo;component/MainPage.xaml", System.UriKind.Relative));
}
}  其中RootFrame.Navigate(new System.Uri("/Demo;component/MainPage.xaml", System.UriKind.Relative));的代码中,Demo为本例中Solution的名称,而且也是MainPage.xaml所在的文件夹名称。
  请注意在Windows Phone 7中文件都是以相对地址来读取的。
  4. 测试
  Debug单步调试,第一次点击Button时,异常发生,在RootFrame_NavigationFailed的方法中,执行RootFrame.Navigate(new System.Uri("/Demo;component/MainPage.xaml", System.UriKind.Relative));
  
DSC0005.jpg   
  RootFrame重新定位MainPage.xaml
  
DSC0006.jpg   
  点击Button之外其他的按钮改变当前Page,如图效果
  
DSC0007.gif   
  然后再次点击Button
  此时RootFrame.CanGoBack,执行
  if (RootFrame.CanGoBack)
  {
  RootFrame.GoBack();
  }
  如图,返回上一个Page。
  
  
  至此,通过RootFrame重定位Page,解决Page页跳转失败程序退出的现象。
  结束语
  此解决方法肯定不是最好的解决方法,最好的方法永远在下一次时出现。本文也只是在初识Windows Phone 7开发的一个思考过程。
  也希望更多的问题在MSDN Windows Phone 7开发论坛(http://social.msdn.microsoft.com/Forums/zh-CN/windowsphonezhchs/threads)中讨论,大家共同思考和解决。
  本例是在Webcast一起学Windows Phone7开发系列课程的代码基础上做的修改
  
  
源码下载

  
  本文来自雪松园的博客,原文地址:http://www.iyunv.com/xuesong/archive/2011/02/25/1964748.html
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-66095-1-1.html 上篇帖子: [Winodows Phone 7控件详解]Silverlight toolkit for Windows Phone 7.1控件-7 下篇帖子: Core Instrumentation Events in Windows 7, Part 2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表