另一帧上的导航服务

时间:2015-10-30 08:06:38

标签: c# wpf navigationservice

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

顶部框架永久保持不变,即有一些按钮显示QuestionsTagsUsers,例如不会改变。当用户点击Questions按钮时,他们应该被带到该计划的相关区域,但在下面的框架内。

问题在于,因为它们位于顶部框架内,NavigationService会在顶部的框架中加载相关页面,而不是在屏幕中心的主框架中。

是否有办法在一帧内点击按钮可以导致不同的框架通过NavigationService加载不同的页面?这是一个绘画示例;

enter image description here

编辑:要更新这个问题,我最初计划做的是让顶部框架不在框架中,而是在window本身。但是,由于window未从page继承,我无法使用NavigationService

2 个答案:

答案 0 :(得分:0)

使用视图模型驱动的MVVM在WPF中进行导航的方法,您可以了解slides of Bryan Anderson中驱动的视图驱动和视图模型的差异。

然后,您可以切换视图模型属性实例,并让它们使用不同的数据模板进行渲染。从codeproject article

中可以看到从代码中注册数据模板的好方法

这样导航服务将改变视图模型实例以及他必须做的所有事情。随着实例类型的更改,另一个数据模板将被用于渲染视图。

答案 1 :(得分:0)

如果要在主框架中加载相关页面,则需要使用主框架的NavigationService,并且可以将顶部框架放在window本身而不在框架中。例如:

在你的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);
}