动态切换 C# 代码中 WPF 网格列的可见性
本文关键字:网格 可见性 WPF 代码 动态 | 更新日期: 2023-09-27 18:34:10
我的问题是:我找不到如何切换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>
此外,网格中充满了一些控件等。现在,我想在 C# 代码中动态隐藏单个列。我尝试通过将列的定义宽度设置为零来实现这一点,例如 Column1.Width = 0
.这有效,但我真的不喜欢这个解决方案 - 真的没有更好的方法吗?
我正在寻找类似myGrid.Columns[0].Visibility = COLLAPSED
或Column1.Visibility = HIDDEN
的东西.我只是找不到这样的东西 - 有什么想法吗?
<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>
请在您的视图模型中实现 INotifyPropertyChanged
方法是将命名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
,并完全控制哪些单元格在任何时候可见。
在代码项目的 WPF 网格列和行隐藏中,它们显示了使用依赖项属性的方法。他们设置Visible = false
,但在内部,它设置Width = 0
。
另一个想法是删除代码隐藏中的列定义...但我想这是一个更糟糕的黑客!:(
一个丑陋的技巧是将宽度更改为 0(看不见,心不烦)。
您不应该这样做的原因有很多,但根据您的情况,这可能就足够了!
使用以下内容隐藏网格。同样,您可以使用 Name 属性隐藏行定义和列定义。
myGrid.Visibility = System.Windows.Visibility.Hidden;