调用NavigationService的时候发生NullReferenceException异常

yeshouwu 2012-11-08 10:33:42
大家好,我刚开始学习WPF,这两天被一个问题困扰了很久,一直没有找到原因。

我正在编写的程序有两个页面,a.xaml和b.xaml。我使用navigationwindow的方式来组合他们。

a页面点击后会先隐藏,之后按F键触发跳转到b页面。
if(e.KeyCode==Keys.F)
{
e.Handled = true;
this.NavigationService.Navigate(b);
// disable按键触发
gkh.unhook();
}


b页面上有两个按钮,一个保存,一个取消。

点击保存会调用this.NavigationService.GoBack()方法返回a页面,点击取消则是返回到按钮触发状态,等待下次用户按F键来跳转到b页面。

当我第一次从a.xaml->按F键->b.xaml时,一切正常,按保存按钮返回首页后再次从a.xaml->按F键->b.xaml也正常,但是当我点击取消按钮,按F键想要跳转到b页面就会提示this.NavigationService.Navigate(b);这里有个NullReferenceException的异常。

不知道谁有解决的办法?

回复 引用
...全文
607 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qhmpblongfirst 2013-12-02
  • 打赏
  • 举报
回复
我原来用 this.NavigationService.Navigate(new WordListPageView()); 会发生上面的异常。 后来修改成 if (this.NavigationService!=null) { this.NavigationService.Navigate(new WordListPageView()); } 导航正常了。 这只是我程序中的,不一定能适应所有人的异常情况。 分享出来,欢迎拍砖。
nnnnyyyy 2013-03-28
  • 打赏
  • 举报
回复
引用 8 楼 feihonggang 的回复:
我的做法是把 导航事件放到 MainPage页的loaded事件里执行的
二师兄说对啊……
feihonggang 2013-03-26
  • 打赏
  • 举报
回复
我的做法是把 导航事件放到 MainPage页的loaded事件里执行的
feihonggang 2013-03-26
  • 打赏
  • 举报
回复
奶奶的这种人真得骂他!哈哈 大家可以参考一下下边的网址: http://www.cnblogs.com/tianyutingxy/archive/2011/09/13/2174587.html 内容是:wp7 my tips 1--万恶的导航 private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e) { // Set the root visual to allow the application to render if (RootVisual != RootFrame) //RootVisual = RootFrame; RootVisual = new MainPage(); // Remove this handler since it is no longer needed RootFrame.Navigated -= CompleteInitializePhoneApplication; }    private void Button_Click(object sender, RoutedEventArgs e) { 方法1:this.NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.Relative)); 方法2:(Application.Current as App).RootFrame.Navigate(new Uri("/Page1.xaml", UriKind.Relative)); }   使用第一种方法发生了NullReferenceException错误,NavigationService是空的。原因:   Page的NavigationService属性是通过依赖属性获得的。其实这里我要了解依赖属性的特点,虽然是一个static字段来维护,但是内部是有Hash表来存放不同对象的属性值。我们在构造函数的Load方法中,加载了配置文件中指定的MainPage,并生成了他的实例,然后设置了NavigationServiceProperty。而这里我们使用,MainPage的是一个新的实例,他的NavigationServiceProperty为Null。所以这里当然会报错了。 而且NavigationServiceProperty是internal属性,说以我们不能手动设置了。--摘抄   从这个异常我们能发现,每次导航的新的页面,在加载完成Page之后,都会设置Page的NavigationServiceProperty的属性。所以并不是创建了Frame,我们就能使用NavigationService来导航。而是需要Frame来吧Page和NavigationService关联起来。而这里,我们new的Mainpage没有通过Frame加载显示的,所以无法导航。--摘抄   使用第二中方法可以导航,但是不显示内容,连续点击两次回退按钮才能推出程序,说明是导航了的。原因:   很简单了,因为Page要通过RootVisual来显示,导航的话Page需要Frame来加载的,当我们把Frame设置到RootVisual时,就能显示,而这里我们设置的MainPage,虽然Frame导航了,但没有被显示出来。但是RootVisual只能设置一次,所以这里没有办法让他显示出来了。--摘抄
wangao20463165 2013-02-28
  • 打赏
  • 举报
回复
碰到这种人 真他妈头大,你问的时候这么积极,你自己解决了 你把解决方法贴出来会他妈累死你啊难道!
watercaltrop 2012-11-14
  • 打赏
  • 举报
回复
怎么解决的,请告诉我一下,我也遇到同样的问题了~~~QQ:149654420
yeshouwu 2012-11-13
  • 打赏
  • 举报
回复
自己找的解决的方法了,谢谢~~
yeshouwu 2012-11-08
  • 打赏
  • 举报
回复
引用 1 楼 Java_Script__ 的回复:
你看看是哪个报NullReferenceException?是B页面还是A页面,这种问题应该比较好定位,自己看调试信息!看看这个this.NavigationService报错的时候鼠标移动到这个对象上,看看是不是null了!·
谢谢提示,我发现当第二次执行这段代码的时候,this.NavigationService变成了null。 如果我加个判断
if(this.NavigationService == null)
{
//...
}
我想要这这里加入代码使this.NavigationService变成非空,该怎么写呢?
yeshouwu 2012-11-08
  • 打赏
  • 举报
回复
引用 1 楼 Java_Script__ 的回复:
你看看是哪个报NullReferenceException?是B页面还是A页面,这种问题应该比较好定位,自己看调试信息!看看这个this.NavigationService报错的时候鼠标移动到这个对象上,看看是不是null了!·
是B页面报NullReferenceException,值是变成null了。 但是我不清楚为什么第一次执行这段代码是ok的,点击b页面的取消按钮后再执行这段代码就会报错。
嘶吼的蚂蚁 2012-11-08
  • 打赏
  • 举报
回复
你看看是哪个报NullReferenceException?是B页面还是A页面,这种问题应该比较好定位,自己看调试信息!看看这个this.NavigationService报错的时候鼠标移动到这个对象上,看看是不是null了!·

111,088

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧