如何在 WPF 中折叠星形大小的网格列?

bro*_*and 9 wpf xaml wpf-grid

Width通过设置为 来使三列具有相同的宽度Auto

<Grid x:Name="myGrid">
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>

  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>

  <Label Grid.Row="0" Grid.Column="0">One</Label>
  <Label Grid.Row="0" Grid.Column="1" x:Name="label1">Two</Label>
  <Label Grid.Row="0" Grid.Column="2">Three</Label>
</Grid>
Run Code Online (Sandbox Code Playgroud)

我想实现的是,如果中间列折叠或隐藏,则其他两列占用剩余空间并获得相同的宽度。

如果我只是因为宽度=“*”而将可见性设置为折叠或隐藏,则其他两列宽度保持不变。

<Label Grid.Row="0" Grid.Column="1" Visibility="Collapsed">Two</Label>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我通过以编程方式将第二列宽度设置为自动来实现所需的功能,但我正在寻找其他一些解决方案(最好是 xaml 方式一)。

private void Button_Click(object sender, RoutedEventArgs e)
{
  this.myGrid.ColumnDefinitions[1].Width = GridLength.Auto;
  this.label1.Visibility = Visibility.Collapsed;
}
Run Code Online (Sandbox Code Playgroud)

tpo*_*pol 11

可以使用 来实现所需的行为UniformGrid

确保将行数设置为 1。

<UniformGrid Rows="1">
    <Label>One</Label>
    <Label>Two</Label>
    <Label>Three</Label>
</UniformGrid>
Run Code Online (Sandbox Code Playgroud)

3 列

其余元素均匀分布。

<UniformGrid Rows="1">
    <Label>One</Label>
    <Label Visibility="Collapsed">Two</Label>
    <Label>Three</Label>
</UniformGrid>
Run Code Online (Sandbox Code Playgroud)

2 列


bro*_*and 2

我按照 Rob 的建议添加了 Xaml Binding,如下所示:

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="*" />
  <ColumnDefinition Width="{Binding MiddleColumnWidth}" />
  <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

<Label Grid.Row="0" Grid.Column="0">One</Label>
<Label Grid.Row="0" Grid.Column="1" Visibility="{Binding IsSecondLabelVisible}">Two</Label>
<Label Grid.Row="0" Grid.Column="2">Three</Label>
Run Code Online (Sandbox Code Playgroud)

xaml 背后的代码:

private bool ShowOnlyTwoColumns;

private GridLength MiddleColumnWidth
{
  get
  {
    if (ShowOnlyTwoColumns)
      return GridLength.Auto; // Auto collapses the grid column when label is collapsed

    return new GridLength(1, GridUnitType.Star);
  }
}

private Visibility IsSecondLabelVisible
{
  get { return this.ShowOnlyTwoColumns ? Visibility.Collapsed : Visibility.Visible; }
}
Run Code Online (Sandbox Code Playgroud)