C# 如何对可折叠项使用网格行和列?

C# 如何对可折叠项使用网格行和列?,c#,wpf,grid,C#,Wpf,Grid,我有一个网格,里面有几个项目,但并非所有项目都可见:有些项目已折叠。WPF中有没有一种简单的方法可以在新项目出现时调整网格中已经可见的项目的大小 事实上,我的需求比这简单:我只有两件物品必须垂直堆放。大多数情况下,只有一个是可见的,但当第二个出现时,我需要第一个调整到网格大小的2/3,第二个放置在填充剩余位置的下方:1/3 我觉得我必须使用Grid.Row属性(可能还有Grid.RowSpan),但我不知道如何实现所需的行为,而不在代码背后搞乱它 我尝试将自动大小与DockPanel的Last

我有一个网格,里面有几个项目,但并非所有项目都可见:有些项目已折叠。
WPF
中有没有一种简单的方法可以在新项目出现时调整网格中已经可见的项目的大小

事实上,我的需求比这简单:我只有两件物品必须垂直堆放。大多数情况下,只有一个是可见的,但当第二个出现时,我需要第一个调整到网格大小的2/3,第二个放置在填充剩余位置的下方:1/3

我觉得我必须使用
Grid.Row
属性(可能还有
Grid.RowSpan
),但我不知道如何实现所需的行为,而不在代码背后搞乱它


我尝试将自动大小与
DockPanel
LastChildFill
属性混合使用,但没有成功。

您可以尝试以下方法:

<Grid Background="Green">
  <Grid.RowDefinitions>
    <RowDefinition Height="*" />
    <RowDefinition>
      <RowDefinition.Style>
        <Style TargetType="{x:Type RowDefinition}">
          <Setter Property="Height"
                  Value="0.25*" />
          <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=secondRect,
                                            Path=Visibility}"
                          Value="Collapsed">
              <Setter Property="Height"
                      Value="0" />
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </RowDefinition.Style>
    </RowDefinition>
  </Grid.RowDefinitions>
  <!--  Row 1  -->
  <Rectangle Grid.Row="0"
              Fill="Blue" />
  <!--  Row 2  -->
  <Rectangle x:Name="secondRect"
              Grid.Row="1"
              Fill="Tomato" />
</Grid>

现在,您在第一行的“元素”上获得了
触发器,而不是
网格.RowDefinition
,当您检测到第二行的元素变为
折叠时,您可以将第一行的行跨度切换为2,否则它将保持为1。您可以尝试以下操作:

<Grid Background="Green">
  <Grid.RowDefinitions>
    <RowDefinition Height="*" />
    <RowDefinition>
      <RowDefinition.Style>
        <Style TargetType="{x:Type RowDefinition}">
          <Setter Property="Height"
                  Value="0.25*" />
          <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=secondRect,
                                            Path=Visibility}"
                          Value="Collapsed">
              <Setter Property="Height"
                      Value="0" />
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </RowDefinition.Style>
    </RowDefinition>
  </Grid.RowDefinitions>
  <!--  Row 1  -->
  <Rectangle Grid.Row="0"
              Fill="Blue" />
  <!--  Row 2  -->
  <Rectangle x:Name="secondRect"
              Grid.Row="1"
              Fill="Tomato" />
</Grid>

现在,您在第一行的“元素”上获得了
触发器,而不是
网格.RowDefinition
,当您检测到第二行的元素变得
折叠时,您将第一行的行跨度切换为2,否则它将保持为1。

您为我打开了一个新字段:直接在XAML中修改样式和属性。非常感谢。您为我打开了一个新字段:直接在XAML中修改样式和属性。非常感谢你。