C# 另一个框架上的导航服务

C# 另一个框架上的导航服务,c#,wpf,navigationservice,C#,Wpf,Navigationservice,我目前有一个程序,它有一个包含两个框架的窗口,一个在屏幕顶部,类似于一个导航面板,用户可以单击不同的按钮导航到程序的区域,这些区域加载到下面的框架中 顶部框架永久保持不变,即有一些按钮,例如说问题,标签和用户,它们不会改变。当用户单击问题按钮时,他们应该被带到程序的相关区域,但在下面的框架内 问题在于,由于它们位于顶部框架内,NavigationService将相关页面加载到顶部框架中,而不是屏幕中央的主框架中 是否有一种方法可以使在一个框架内单击的按钮导致不同的框架通过导航服务加载不同的页面?

我目前有一个程序,它有一个包含两个框架的窗口,一个在屏幕顶部,类似于一个导航面板,用户可以单击不同的按钮导航到程序的区域,这些区域加载到下面的框架中

顶部框架永久保持不变,即有一些按钮,例如说
问题
标签
用户
,它们不会改变。当用户单击
问题
按钮时,他们应该被带到程序的相关区域,但在下面的框架内

问题在于,由于它们位于顶部框架内,
NavigationService
将相关页面加载到顶部框架中,而不是屏幕中央的主框架中

是否有一种方法可以使在一个框架内单击的按钮导致不同的框架通过
导航服务加载不同的页面
?这里是一个绘画的例子


编辑:为了更新这个问题,我最初计划做的是让顶部框架不在框架中,而是在
窗口中。但是,由于
窗口
没有继承自
页面
,因此我无法使用
导航服务

在WPF中使用视图模型驱动的MVVM进行导航,您可以了解视图驱动和视图模型驱动的区别

然后可以切换视图模型属性实例,并让它们使用不同的数据模板进行渲染。下面显示了从代码中注册数据模板的好方法


这样,导航服务将更改视图模型实例,这就是他所要做的。随着实例类型的更改,将使用另一个数据模板来呈现视图。

如果要在主框架中加载相关页面,则需要使用主框架的
导航服务
,并且可以将顶部框架放置在
窗口中
本身,而无需在框架中。例如:

在您的XAML中

<Window x:Class="WPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WPF" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="MainWindow" Width="525" Height="350" mc:Ignorable="d">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="80" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Button x:Name="Questions" Margin="20" Click="Questions_Click">Questions</Button>
            <Button x:Name="Tags" Grid.Column="1" Margin="20" Click="Tags_Click">Tags</Button>
            <Button x:Name="Users" Grid.Column="2" Margin="20" Click="Users_Click">Users</Button>
        </Grid>
        <Frame x:Name="MainFrame" Grid.Row="1" />
    </Grid>
</Window>
private void Questions_Click(object sender, RoutedEventArgs e)
{
    //The relevant page you want to load
    QuestionsPage questionsPage = new QuestionsPage();
    MainFrame.NavigationService.Navigate(questionsPage);
    //Also you can use Frame.Navigate Method
    //MainFrame.Navigate(questionsPage);
}