28

我的问题是:我不知道如何切换我的 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 = COLLAPSEDor Column1.Visibility = HIDDEN。我只是找不到类似的东西-有什么想法吗?

4

5 回答 5

37
<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

于 2018-08-22T12:52:45.363 回答
14

最简单的方法是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>

更新>>>

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

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

您甚至可以Grid在主单元格的每个单元格中添加一个,Grid并且可以完全控制哪些单元格在任何时候都可见。

于 2013-10-07T14:16:04.537 回答
7

WPF Grid Column and Row Hiding on Code Project 中,它们展示了一种使用依赖属性的方法。他们设置Visible = false,但在内部,它设置Width = 0

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

于 2013-10-07T14:19:08.237 回答
3

一个丑陋的技巧是将宽度更改为 0(看不见,心不在焉)。

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

于 2013-10-07T14:36:17.327 回答
-10

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

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

于 2014-03-17T09:58:38.470 回答