WPF 窗口Frame内的Page调用NavigationService.Navigate报空引用如何解决
WPF窗口内Frame多页面导航空引用问题解决方案
异常原因
你遇到的System.NullReferenceException是因为Page类的NavigationService实例属性,只有当Page被完整挂载到导航宿主(Frame、NavigationWindow等)后才会被赋值,在Page构造阶段或刚被Navigate加载的短时间内访问该属性会返回null,直接调用就会触发空引用异常。
可行解决方案
方案1:使用静态方法获取当前Page所属的导航服务(推荐,无耦合)
直接调用WPF官方提供的NavigationService.GetNavigationService()静态方法获取宿主的导航实例,无需依赖父窗口结构,修改Page1的按钮点击代码即可:
private void Button_Click_2(object sender, RoutedEventArgs e) { var navService = System.Windows.Navigation.NavigationService.GetNavigationService(this); // 增加空判断避免极端场景报错 navService?.Navigate(new Uri("NextPage.xaml", UriKind.Relative)); }
方案2:直接调用父窗口的Frame实例导航(可控性更高)
如果需要更精准的控制导航逻辑,可以直接获取父窗口的Frame实例进行操作,需要先确认MainWindow中Frame的访问权限为internal(默认x:Name生成的就是internal,同程序集可直接访问)或者public:
private void Button_Click_2(object sender, RoutedEventArgs e) { // 获取当前Page所在的父窗口 if (System.Windows.Window.GetWindow(this) is MainWindow mainWindow) { mainWindow.Main.Navigate(new Uri("NextPage.xaml", UriKind.Relative)); } }
额外优化建议
如果项目中存在多页面频繁导航的需求,可以封装统一的导航帮助类,将Frame实例全局注册,避免每个页面重复编写查找导航宿主的逻辑。
内容的提问来源于stack exchange,提问作者Dankindonut
相关产品推荐
相关产品推荐

