当前位置: 首页 >服务端 > Windows Phone 7 页面导航以及异常处理

Windows Phone 7 页面导航以及异常处理

Windows Phone 7 页面导航以及异常处理 _ JavaClub全栈架构师技术笔记
目录
 
 

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).
Assembly: Microsoft.Phone (in Microsoft.Phone.dll)
Windows Phone 7 页面导航以及异常处理 _ JavaClub全栈架构师技术笔记 Syntax
Windows Phone 7 页面导航以及异常处理 _ JavaClub全栈架构师技术笔记
public bool Navigate(
    Uri source
)

Parameters

source
Type: System.Uri
The URI of the content to navigate to.

Retu Value

Retus Boolean. True if the navigation started successfully; otherwise, false.
 
 

示例说明

我们以MainPage中点击鼠标跳转到另一个页面为例说明
  1. 在MainPage中添加button按钮
Windows Phone 7 页面导航以及异常处理 _ JavaClub全栈架构师技术笔记
 
  1. 添加鼠标响应
鼠标选中Button,然后点击右键选择属性"Properties",在"Events"中添加鼠标单击Click事件,名称为"button1_Click"
Windows Phone 7 页面导航以及异常处理 _ JavaClub全栈架构师技术笔记
 
在鼠标响应事件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 MembersNavigationFailed事件处理。
 
本例中在App.xaml.cs中找到RootFrame_NavigationFailed方法,此方法就是本例中PhoneApplicationFrame捕获NavigationService.NavigationFailed Event处理页面跳转异常的处理。
RootFrameWindows Phone 7--Silverlight应用程序的根窗体(Frame),在此根窗体下silverlightPage页被调用。
 
RootFrame被定义在App.xaml.cs中,如图
Windows Phone 7 页面导航以及异常处理 _ JavaClub全栈架构师技术笔记
 
原来的代码如下:
// 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. 测试

  1. Debug单步调试,第一次点击Button时,异常发生,在RootFrame_NavigationFailed的方法中,执行RootFrame.Navigate(new System.Uri("/Demo;component/MainPage.xaml", System.UriKind.Relative));
Windows Phone 7 页面导航以及异常处理 _ JavaClub全栈架构师技术笔记
 
RootFrame重新定位MainPage.xaml
 
Windows Phone 7 页面导航以及异常处理 _ JavaClub全栈架构师技术笔记
  1. 点击Button之外其他的按钮改变当前Page,如图效果
Windows Phone 7 页面导航以及异常处理 _ JavaClub全栈架构师技术笔记
  1. 然后再次点击Button
    此时RootFrame.CanGoBack,执行
    if (RootFrame.CanGoBack)
    {
    RootFrame.GoBack();
    }
    如图,返回上一个Page
    Windows Phone 7 页面导航以及异常处理 _ JavaClub全栈架构师技术笔记
     
    至此,通过RootFrame重定位Page,解决Page页跳转失败程序退出的现象。
     

结束语

此解决方法肯定不是最好的解决方法,最好的方法永远在下一次时出现。本文也只是在初识Windows Phone 7开发的一个思考过程。
也希望更多的问题在MSDN Windows Phone 7开发论坛(http://social.msdn.microsoft.com/Forums/zh-CN/windowsphonezhchs/threads)中讨论,大家共同思考和解决。
本例是在Webcast一起学Windows Phone7开发系列课程的代码基础上做的修改,源代码请下载 Navigation_Demo.zip
 
 

作者:Xuesong
来源链接:https://www.cnblogs.com/xuesong/archive/2011/02/25/1964748.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/server/112171.html

标签:异常处理
分享给朋友:

“Windows Phone 7 页面导航以及异常处理” 的相关文章

[C#][控件]列表控件listbox(一) 2022年05月17日 20:45:24
MySQL安装之yum安装 2022年05月19日 19:54:29
python中循环的技巧 2022年05月23日 21:49:36
备战5月软考 2022年05月23日 22:39:11
飞算soflu软件机器人 2022年05月25日 22:23:09
项目ITP(三) 玩玩 服务端 到 app端 2022年05月26日 21:10:00
2.你中断线程的方式用对了么? 2022年05月26日 22:33:19