1

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

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

在此处输入图像描述

我觉得我必须使用这些Grid.Row属性(也许还有Grid.RowSpan),但我不知道如何实现所需的行为而不会在代码隐藏中弄乱它。

我尝试过的是将自动大小与没有成功的LastChildFill属性混合在一起。DockPanel

4

1 回答 1

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>

因此,您在Style.Trigger第二个 Grid 行上设置 a 以检查它包含的元素是否是Collapsed,如果是,则将其高度设置为“0”,如果不是,则设置为“0.25 *”,而Grid第 1行将其设置Height为 * 或“所有剩余空间”这将与罚款有关。

备用:

你可以Grid.RowSpan像你提到的那样做。

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

现在你得到了Trigger第一行的“元素”而不是Grid.RowDefinition当你检测到第二行的元素变成Collapsed你将第一行的 RowSpan 切换为 2 否则它保持在 1。

于 2013-06-30T21:18:30.080 回答