【问题标题】:Dynamically toggle visibility of WPF grid column from C# code从 C# 代码动态切换 WPF 网格列的可见性
【发布时间】:2013-10-14 03:49:32
【问题描述】:

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

【问题讨论】:

  • @DaveRook 当然可以——我只是好奇是否有一种简单的方法没有这种黑客攻击
  • 您希望该列中的控件会发生什么?
  • @DaveRook 折叠列时,我也想折叠包含的所有控件 - 所以包括内容在内的整个列应该是不可见的
  • Hide grid row in WPF的可能重复

标签: c# wpf xaml grid visibility


【解决方案1】:
<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

【讨论】:

  • 如果您想要列的动态可见性,这是​​要走的路。
  • @Lennart 同意。这应该是公认的解决方案。
  • 简单干净。我同意这应该是公认的答案,因为它提供了相当多的灵活性并允许用户坚持使用 MVVM。
【解决方案2】:

最简单的方法是在要隐藏的相关列中添加一个名为 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 的每个单元格中,并且可以完全控制随时可见的单元格。

【讨论】:

  • 是的,我想我必须重新排列 XAML 代码才能实现我想要的 - 尽管这是我试图避免的事情,因为它是来自一些同事的大量代码..无论如何谢谢:)
  • 即使你想同时隐藏一列和一行会遇到麻烦
  • 折叠行/列中的所有元素仅在其高度/宽度设置为“自动”时折叠行/列。想折叠看:codeproject.com/articles/437237/wpf-grid-column-and-row-hiding
【解决方案3】:

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

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

【讨论】:

  • 我尝试删除列定义本身:网格重新排列正确,但列的内容仍然存在(元素重叠)..但是谢谢 ;)
【解决方案4】:

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

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

【讨论】:

  • 您能分享一些为什么将高度设置为零是个坏主意吗?
  • 如果该行可重新调整大小,您可能需要保存并恢复该大小,但同时会执行 0 高度
【解决方案5】:

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

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

【讨论】:

  • 只需要隐藏一列而不是整个网格。
猜你喜欢
  • 2018-12-18
  • 1970-01-01
  • 2014-04-07
  • 2010-11-16
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 2013-09-26
  • 2014-08-26
相关资源
最近更新 更多