调用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的异常。

不知道谁有解决的办法?

回复 引用
...全文
615 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了!·
资源下载链接为: https://pan.quark.cn/s/9648a1f24758 在WPF中,Window和Page是两种重要的设计元素,分别用于创建独立窗口和可导航页面,它们之间的相互调用对于构建复杂用户界面和导航框架非常关键。 一、创建Window和Page 首先,需要创建一个Window类实例,它是应用的主入口点。在XAML中,可以定义Window的外观和布局,例如: 接着,创建Page类实例,它将作为导航的内容。Page的XAML结构与Window类似,通常包含在Grid或其他布局容器内,例如: 二、导航与通信 Window调用Page:在Window中,可以通过NavigationService或Frame来加载Page。例如,在按钮点击事件中: Page调用Window:Page不能直接访问Window,但可以通过事件或依赖属性间接通信。例如,Page触发一个事件,由其所在的Window监听并响应: 数据绑定与MVVM模式:为了更好地实现通信,WPF推荐使用MVVM设计模式。View(如Window或Page)通过数据绑定与ViewModel交互,ViewModel负责业务逻辑和数据处理。Window和Page可以通过共享同一ViewModel实现通信。 三、使用NavigationService WPF的NavigationService提供了一种高级导航机制,允许在多个Page之间跳转。在App.xaml.cs中设置NavigationService: Page可以通过以下方式导航到另一个Page: 总结来说,WPF中Window与Page的相互调用涉及导航、事件、依赖属性和MVVM模式等技术。掌握这些技术,可以构建出高效交互和流畅导航的现代应用程序。在AppDemo项目中,可以找到更多关于WPF导航框架的实践示例。

111,101

社区成员

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

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

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