【问题标题】:Navigation Service on Another Frame另一个框架上的导航服务
【发布时间】:2015-11-01 20:10:27
【问题描述】:

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

顶部框架永久保持不变,即有诸如 Questions、Tags 和 Users 的按钮不会改变。当用户点击Questions 按钮时,他们应该被带到程序的相关区域,但在下面的框架内。

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

有没有一种方法可以在一个框架内单击一个按钮,从而导致另一个框架通过NavigationService 加载不同的页面?这是一个绘画示例;

编辑:要更新这个问题,我最初计划做的是将顶部框架不在框架中,而是在 window 本身中。但是因为window 不是从page 继承的,所以我不能使用NavigationService。

【问题讨论】:

    标签: c# wpf navigationservice


    【解决方案1】:

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

    然后您可以切换视图模型属性实例并让它们使用不同的数据模板进行渲染。这个codeproject article展示了一个从代码注册数据模板的好方法。

    这样导航服务会改变视图模型实例,这就是他所要做的。随着实例类型的变化,另一个数据模板被选中来呈现视图。

    【讨论】:

      【解决方案2】:

      如果您想在主框架中加载相关页面,您需要使用主框架的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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 2015-11-24
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多