从C#代码动态切换WPF网格列的可见性

时间:2013-10-07 14:11:04

标签: c# wpf xaml grid visibility

我的问题是:我无法找到如何切换WPF网格列的可见性。假设遵循XAML标记:

<Grid x:Name="myGrid">
    <Grid.RowDefinitions>
        <RowDefinition x:Name="Row1" />
        <RowDefinition x:Name="Row2" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="Column1" />
        <ColumnDefinition x:Name="Column2" />
    </Grid.ColumnDefinitions>
</Grid>

Aferwards网格中充满了一些控件等。现在我想从C#代码中动态隐藏一列。我试过通过将列的定义宽度设置为零来实现这一点,例如Column1.Width = 0。这有效,但我真的不喜欢这个解决方案 - 真的没有更好的方法吗?

我正在寻找myGrid.Columns[0].Visibility = COLLAPSEDColumn1.Visibility = HIDDEN之类的内容。我只是找不到那样的东西 - 任何想法?

5 个答案:

答案 0 :(得分:12)

最简单的方法是在要隐藏的相关列中添加一个名为Grid的顶级控件。然后你可以像其他任何控件一样隐藏它及其所有内容:

在XAML中:

<Grid x:Name="myGrid">
    <Grid.RowDefinitions>
        <RowDefinition x:Name="Row1" />
        <RowDefinition x:Name="Row2" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="Column1" />
        <ColumnDefinition x:Name="Column2" />
    </Grid.ColumnDefinitions>
    <Grid x:Name="GridColumn1" Grid.Column="1">
        ...
    </Grid>
</Grid>

然后在代码背后:

GridColumn1.Visibility = Visibility.Collapsed;

由于Grid中有多行,您可能需要重新排列这些行:

<Grid x:Name="myGrid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="Column1" />
        <ColumnDefinition x:Name="Column2" />
    </Grid.ColumnDefinitions>
    <Grid x:Name="GridColumn0" Grid.Column="0">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
    </Grid>
    <Grid x:Name="GridColumn1" Grid.Column="1">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
    </Grid>
</Grid>

更新&gt;&gt;&gt;

没有必要像这样重新安排主Grid ...你可以同样轻松添加两个Grid控件,相关的每行一个列,然后将它们Visibility放在一起:

InnerGrid1.Visibility = InnerGrid2.Visibility = Visibility.Collapsed;

您甚至可以在主Grid的每个单元格中添加Grid,并可以完全控制一次可见的单元格。

答案 1 :(得分:6)

在代码项目的WPF Grid Column and Row Hiding中,它们显示了使用依赖项属性的方法。他们设置Visible = false,但在内部设置Width = 0

另一个想法是删除代码背后的列定义...但我想这是一个更糟糕的黑客! :(

答案 2 :(得分:5)

<ColumnDefinition>
       <ColumnDefinition.Style>
             <Style TargetType="ColumnDefinition">
                 <Setter Property="Width" Value="*" />
                     <Style.Triggers>
                         <DataTrigger Binding="{Binding IsColumnVisible}" Value="False">
                             <Setter Property="Width" Value="0" />
                         </DataTrigger>
                      </Style.Triggers>
              </Style>
       </ColumnDefinition.Style>
</ColumnDefinition>

请在您的ViewModel中实现INotifyPropertyChanged

答案 3 :(得分:3)

丑陋的黑客只是将宽度改为0(看不见,不在乎)。

为什么你不应该这样做有很多原因,但根据你的情况,这可能就足够了!

答案 4 :(得分:-7)

使用以下隐藏网格。同样,您可以使用Name属性隐藏行定义和列定义。

myGrid.Visibility = System.Windows.Visibility.Hidden;