C# WPF第'页;的导航服务为空。如何在我的页面上获得导航服务?

C# WPF第'页;的导航服务为空。如何在我的页面上获得导航服务?,c#,wpf,C#,Wpf,我试图在代码中从一个页面导航到另一个页面: if (Game.IsShopping) NavigationService.Navigate("ShopPage.xaml", Game.CurrentShop); 然而,我在NavigationService上得到一个null引用异常,表示我当前页面的属性为null。为什么会这样?如何在我的页面上获得导航服务?首先设置一个框架(在xamel主窗口中呈现) 或者,如果您在控制器操作代码块内,请使用下面的命令 void ExampleCont

我试图在代码中从一个页面导航到另一个页面:

if (Game.IsShopping)
    NavigationService.Navigate("ShopPage.xaml", Game.CurrentShop);
然而,我在NavigationService上得到一个null引用异常,表示我当前页面的属性为null。为什么会这样?如何在我的页面上获得导航服务?

首先设置一个框架(在xamel主窗口中呈现)

或者,如果您在控制器操作代码块内,请使用下面的命令

void ExampleControllButton_Click(object sender, RoutedEventArgs e)
{
this.NavigationService.Navigate(new Uri("ShopPage.xaml", Game.CurrentShop));
}
找到解决方案:我为NavigationService创建了一个包装器:

public static class Navigator
{
    private static NavigationService NavigationService {get;} = (Application.Current.MainWindow as MainWindow).mainFrame.NavigationService;

    public static void Navigate(string path, object param = null)
    {
        NavigationService.Navigate(new Uri(path, UriKind.RelativeOrAbsolute), param);
    }

    public static void GoBack()
    {
        NavigationService.GoBack();
    }

    public static void GoForward()
    {
        NavigationService.GoForward();
    }
}

我无法从框架中包含的页面访问窗口中的框架。我需要把电话转到其他地方导航服务吗?如果是这样的话,我该如何从页面上称呼它?或者我的做法完全错了?只需添加包含上述框架的dockpanel标记,然后调用框架,确保没有“网格”标记,然后调用mainFrm.NavigationService.Navigate(新Uri(“ShopPage.xaml”,Game.CurrentShop)),您可以从任何其他控制器调用它,正如我在上面向您展示的,“this”而不是frame,这取决于您的情况为什么添加DockPanel会使页面可以访问frame?这看起来真的很奇怪…Docker面板中的UI元素位于“Children属性”中,这就是为什么
void ExampleControllButton_Click(object sender, RoutedEventArgs e)
{
this.NavigationService.Navigate(new Uri("ShopPage.xaml", Game.CurrentShop));
}
public static class Navigator
{
    private static NavigationService NavigationService {get;} = (Application.Current.MainWindow as MainWindow).mainFrame.NavigationService;

    public static void Navigate(string path, object param = null)
    {
        NavigationService.Navigate(new Uri(path, UriKind.RelativeOrAbsolute), param);
    }

    public static void GoBack()
    {
        NavigationService.GoBack();
    }

    public static void GoForward()
    {
        NavigationService.GoForward();
    }
}