我目前有一个程序,它有一个包含两个框架的窗口,一个在屏幕顶部,类似于导航面板,用户可以点击不同的按钮导航到程序区域,这些区域被加载到下面的框架。
顶部框架永久保持不变,即有一些按钮显示Questions
,Tags
和Users
,例如不会改变。当用户点击Questions
按钮时,他们应该被带到该计划的相关区域,但在下面的框架内。
问题在于,因为它们位于顶部框架内,NavigationService
会在顶部的框架中加载相关页面,而不是在屏幕中心的主框架中。
是否有办法在一帧内点击按钮可以导致不同的框架通过NavigationService
加载不同的页面?这是一个绘画示例;
编辑:要更新这个问题,我最初计划做的是让顶部框架不在框架中,而是在window
本身。但是,由于window
未从page
继承,我无法使用NavigationService
。
答案 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);
}