在 WPF 中隐藏网格行

我有一个简单的 WPF 表单,表单上声明了一个 Grid:

<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="30" />
<RowDefinition Height="Auto" Name="rowToHide" />
<RowDefinition Height="Auto" MinHeight="30" />
</Grid.RowDefinitions>

名为 rowToHide的行包含一些输入字段,我想在检测到不需要这些字段后隐藏这一行。将 Visibility = Hidden设置为行中的所有项很简单,但是该行仍然占用了 Grid中的空间。我尝试设置 Height = 0的项目,但似乎没有工作。

你可以这样想: 你有一个表单,在那里你有一个下拉框说“支付类型”,如果人选择“现金”,你想隐藏包含信用卡详细信息的行。不能使用此隐藏项启动窗体。

100385 次浏览

将 Row 的内容可见性设置为 Visibility.Collapsed而不是 Hidden。这将使内容停止占用空间,并且行将适当收缩。

作为参考,Visibility是一个三状态 System.Windows.Visibility枚举:

  • 可见-元素得到渲染并参与布局。
  • 折叠-元素是不可见的,不参与布局。有效地给它一个高度和宽度为0,并且表现得好像它不存在一样。
  • Hidden - The element is invisible but continues to participate in layout.

请参阅 这个小费和关于 WPF 提示和技巧线程的其他提示。

You can also do this by referencing the Row in the Grid and then changing the Height of the row itself.

XAML

<Grid Grid.Column="2" Grid.Row="1" x:Name="Links">
<Grid.RowDefinitions>
<RowDefinition Height="60" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="80" />
</Grid.RowDefinitions>
</Grid>

VB.NET

If LinksList.Items.Count > 0 Then
Links.RowDefinitions(2).Height = New GridLength(1, GridUnitType.Star)
Else
Links.RowDefinitions(2).Height = New GridLength(0)
End If

虽然网格中的元素折叠也可以工作,但是如果网格中有许多项目没有可以折叠的封闭元素,那么这个工作就会简单一些。这将提供一个很好的替代方案。

只需这样做: < br > rowToHide.Height = new GridLength(0); < br >

如果你将使用 visibility.Collapse,那么你必须为行中的每个成员设置它。

Row 没有可见性属性,因此正如其他人所说,您需要设置 Height。另一种选择是使用转换器,以防在许多视图中需要此功能:

    [ValueConversion(typeof(bool), typeof(GridLength))]
public class BoolToGridRowHeightConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value == true) ? new GridLength(1, GridUnitType.Star) : new GridLength(0);
}


public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{    // Don't need any convert back
return null;
}
}

然后在适当的视图 <Grid.RowDefinition>:

<RowDefinition Height="{Binding IsHiddenRow, Converter={StaticResource BoolToGridRowHeightConverter}}"></RowDefinition>

通过继承 RowDefinition (只是为了感兴趣) ,我有了类似的想法

public class MyRowDefinition : RowDefinition
{
private GridLength _height;


public bool IsHidden
{
get { return (bool)GetValue(IsHiddenProperty); }
set { SetValue(IsHiddenProperty, value); }
}


// Using a DependencyProperty as the backing store for IsHidden.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsHiddenProperty =
DependencyProperty.Register("IsHidden", typeof(bool), typeof(MyRowDefinition), new PropertyMetadata(false, Changed));


public static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var o = d as MyRowDefinition;
o.Toggle((bool)e.NewValue);
}


public void Toggle(bool isHidden)
{
if (isHidden)
{
_height = this.Height;
this.Height = new GridLength(0, GridUnitType.Star);
}
else
this.Height = _height;
}
}

现在你可以这样使用它:

 <Grid.RowDefinitions>
<RowDefinition Height="2*" />
<my:MyRowDefinition Height="4*" IsHidden="false" x:Name="RowToHide" />
<RowDefinition Height="*" />
<RowDefinition Height="60" />
</Grid.RowDefinitions>

and toggle with

RowToHide.IsHidden = !RowToHide.IsHidden;

您可以将 Controls (行中的字段)的 Visiability 属性设置为“ Collapsed”,而不必操作网格行。这将确保控件不会占用任何空间,如果有 Grid Row Height = “ Auto”,则该行将被隐藏,因为该行中的所有控件都具有 Visiability = “ Collapsed”。

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" Name="rowToHide" />
</Grid.RowDefinitions>


<Button Grid.Row=0 Content="Click Me" Height="20">
<TextBlock Grid.Row=1
Visibility="{Binding Converter={StaticResource customVisibilityConverter}}" Name="controlToHide"/>


</Grid>

此方法更好,因为在 Converter 的帮助下,可以将控件的可见性绑定到某个属性。

The best and clean solution to collapse rows or columns is to use a DataTrigger so in your case:

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="30" />
<RowDefinition Name="rowToHide">
<RowDefinition.Style>
<Style TargetType="{x:Type RowDefinition}">
<Setter Property="Height" Value="Auto" />
<Style.Triggers>
<DataTrigger Binding="{Binding SomeBoolProperty}" Value="True">
<Setter Property="Height" Value="0" />
</DataTrigger>
</Style.Triggers>
</Style>
</RowDefinition.Style>
</RowDefinition>
<RowDefinition Height="Auto" MinHeight="30" />
</Grid.RowDefinitions>
</Grid>