You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:06:03