4

我有一个简单的应用程序,其中有一个包含一些操作的主屏幕,以及第二个屏幕,您可以在第一个屏幕完成并按下按钮时访问该屏幕。见图片:

在此处输入图像描述

棕色区域是固定的左侧菜单,将始终出现在同一位置。 蓝色区域是从一个更改到另一个的屏幕。 红色区域正在尝试从 WindowsForms 模拟 MDIContainer。

如何将该容器模拟为

  1. 维护左侧静态菜单

  2. 由于某些事件/动作而动态更改我的内容?

4

2 回答 2

3

最好的方法是首先使用网格控件来布置控件(如 Blam 建议的那样),如下所示:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <!-- Menu control. (Whichever you see fit. The menu could be established 
         within this control, or you could use a custom UserControl depending
         on your needs.) -->
    <StackPanel />

    <!-- Content control -->
    <ContentPresenter Name="ContentHolder" 
                      Grid.Column="1" />
</Grid>

根据您的设计模式,有几种方法可以让您的内容按需要显示。

如果您使用的是 MVVM,则 ContentPresenter 控件可以绑定到主窗口数据上下文中的 ViewModel,如下所示:

    <ContentPresenter Name="ContentHolder" 
                      Grid.Column="1"
                      Content="{Binding ContentData}" /> 

您的 ViewModel 中将存在相应的属性,例如:

    public ViewModelBase ContentData{
      get { return _contentData; }
    }

如果这对您来说很多希腊语,那么您可能没有使用 MVVM 作为您的设计模式。在这种情况下,主窗口类后面的代码可以处理使用事件处理程序设置 ContentPresenter 的内容。

您的事件处理程序的要点可能是这样的:

    public void HandleNavigationChange(SwitchCondition sc){
      UserControl newContent = null;

      switch (sc) {
        case SwitchCondition.NavigationItem1:
          newContent = new NavigationItem1();
          break;

        case SwitchCondition.NavigationItem1:
          newContent = new NavigationItem1();
          break;
        //ETC
      }

      ContentHolder.Content = newContent;
    }

然后,您可以从菜单项单击中调用此方法,或者如果您愿意,可以从子控件中调用此方法。

于 2013-01-14T20:38:44.367 回答
2
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="2*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Grid.Column="0" Text="Static"/>
    <ContentControl x:Name="content1" Grid.Row="0" Grid.Column="1" Visibility="Visible" >
        <StackPanel>
            <TextBlock Text="One" />
            <Button Click="btn1_click" Content="Button1"/>
        </StackPanel>
    </ContentControl>
    <ContentControl x:Name="content2" Grid.Row="0" Grid.Column="1" Visibility="Hidden" >
        <StackPanel>
            <TextBlock Text="Two" />
            <Button Click="btn2_click" Content="Button2"/>
        </StackPanel>
    </ContentControl>
</Grid>

        private void btn1_click(object sender, RoutedEventArgs e)
        {
            content1.Visibility = System.Windows.Visibility.Hidden;
            content2.Visibility = System.Windows.Visibility.Visible;
        }

        private void btn2_click(object sender, RoutedEventArgs e)
        {
            content1.Visibility = System.Windows.Visibility.Visible;
            content2.Visibility = System.Windows.Visibility.Hidden;
        }

如果您可以将上面的按钮放在菜单区域中
可以使用 Frame 和 Page 内容做我动态的东西
这个示例显示将数据传递给 Page 构造函数
nextPage 是一个 Page
也可以是一个 UserControl

<Frame Name="SrchItemEditField" />

PageDocFieldDetail nextPage = new PageDocFieldDetail(df);
SrchItemEditField.Content = nextPage;
于 2013-01-14T18:29:55.197 回答