【问题标题】:WPF Change between controls控件之间的 WPF 更改
【发布时间】:2013-01-14 18:01:02
【问题描述】:

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

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

我怎样才能模拟那个容器来

  1. 保留左侧静态菜单

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

【问题讨论】:

  • 查看我的回答here,了解处理这种情况的通用方法。
  • 感谢本杰明,非常有建设性!

标签: .net wpf visual-studio-2010 wpf-controls devexpress


【解决方案1】:

最好的方法是首先使用网格控件来布置控件(如 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;
            }
    

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

    <Frame Name="SrchItemEditField" />
    
    PageDocFieldDetail nextPage = new PageDocFieldDetail(df);
    SrchItemEditField.Content = nextPage;
    

    【讨论】:

    • 谢谢!!真的很容易理解,正是我想要的!只是出于好奇:我做过一次,我记得我将面板与主设计窗口分开。我正在使用 Visual Studio 进行设计。有什么办法可以将contentcontrols设计在主窗口的不同位置,这样就可以避免重叠设计,让它们出现在同一个位置?
    • 查看答案底部 - 使用 Pages。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2010-11-04
    • 2010-10-28
    • 2012-07-17
    • 1970-01-01
    • 2014-06-05
    • 2015-02-10
    • 1970-01-01
    相关资源
    最近更新 更多