WPF控件切换

4
我有一个简单的应用程序,它有一个主屏幕和一些操作,还有第二个屏幕,当你完成第一个操作并按下按钮时会访问它。参见以下图片: enter image description here 棕色区块是固定的左侧菜单,将始终出现在相同位置。 蓝色区块是从一个屏幕切换到另一个屏幕。 红色区域试图模拟 WindowsForms 中的 MDIContainer。
如何模拟容器来:
  1. 保持静态菜单栏

  2. 根据某些事件/操作动态更改内容?


查看我的答案这里,可以通用处理这种情况。 - Benjamin Gale
谢谢Benjamin,非常有建设性! - Sonhja
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;
    }

您可以从菜单项点击或子控件中调用此方法。

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;
        }

如果您可以将按钮放在菜单区域之上
可以为我执行帧和页面内容的动态操作
此示例演示向页面构造函数传递数据
nextPage是一个页面
也可以是一个用户控件

<Frame Name="SrchItemEditField" />

PageDocFieldDetail nextPage = new PageDocFieldDetail(df);
SrchItemEditField.Content = nextPage;

谢谢!非常易懂,正是我所需要的!只是好奇:我曾经这样做过,并且我记得我在主设计窗口之外绘制了面板。我正在使用Visual Studio进行设计。有没有办法在主窗口的不同位置设计内容控件,以便我们可以避免重叠设计,并使它们出现在相同的位置? - Sonhja
1
请使用 Pages 查看答案底部。 - paparazzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接