具有RowDefinition的网格中的网格高度=" auto"抑制高度=" *"儿童网格的RowDefinitions

时间:2015-01-30 13:10:03

标签: wpf

我有以下代码:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
    <Grid Grid.Row="0" TextBlock.Foreground="Blue" ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <TextBlock Text="test" Grid.Row="0" />
        <TextBlock Text="test" Grid.Row="2" />
    </Grid>

    <Grid Grid.Row="1" TextBlock.Foreground="Red" ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <TextBlock Text="test" Grid.Row="0"/>
        <TextBlock Text="test" Grid.Row="2"/>
    </Grid>
</Grid>

它只是两个相等的网格,有三行,所有三个应该具有相同的大小(每个都在它自己的网格中,即)。

底部网格,包含在父行中,高度为&#34; *&#34;表现如预期。无论放入什么内容,每行的大小都相同。

但是包含在高度为Auto的行中的顶部网格似乎丢弃了Height =&#34; *&#34;,并且表现得好像它们具有Height =&#34; Auto&#34;。第一行和第三行准确地获得了他们要求的高度,而第二行(空行)的高度恰好为0.这是正常的行为吗?如果是这样,为什么会这样呢?

这是它出现的方式: Image

这就是我期望它的工作方式: enter image description here

2 个答案:

答案 0 :(得分:4)

此行为是预期的。 Height="*"表示所有行都将共享均匀可用的空间

  

该值表示为可用空间的加权比例

当您将父行高度设置为auto时,意味着子Grid不再垂直拉伸,因此没有可用空间来共享,因此行将只占用所需的空间。就像你设置VerticalAlignment="Top"一样。

您可以使用顶部Grid上的SharedSizeGroup来实现您的目标。在这种情况下,所有行都属于同一个组,并且所有行都将共享相同的高度

<Grid Grid.Row="0" IsSharedSizeScope="True" TextBlock.Foreground="Blue" ShowGridLines="True" >
   <Grid.RowDefinitions>
      <RowDefinition SharedSizeGroup="CommonRow"/>
      <RowDefinition SharedSizeGroup="CommonRow"/>
      <RowDefinition SharedSizeGroup="CommonRow"/>
   </Grid.RowDefinitions>
   <TextBlock Text="test" Grid.Row="0" />
   <TextBlock Text="test" Grid.Row="2" />
</Grid>

答案 1 :(得分:2)

它表现正常。
当您设置Height="*"表示填充其余空格时,Height="Auto"表示适合所有内部控件
所以第一行适合你拥有的只有两个的所有控件,因为没有Height属性设置为第一个内部网格或TextBlocks,它只需要等于yourFirstTextBlock.Height + yourSecondTextBlock.Height的高度。