在WPF应用程序中将最后一个网格行扩展以填充窗口

4

我在一个WPF应用程序中有以下的网格设置。

  <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="220" />
            <RowDefinition Height="40" />
            <RowDefinition Height="80" />
            <RowDefinition Height="180*" />
        </Grid.RowDefinitions>
  <!-- some content -->
 </Grid>

我希望最后一行占据其父容器中所有可用的高度。但是,似乎在最后一行定义中,'*' 命令没有生效。
请注意,我想要所有其他行的高度都是固定的。
这是否有可能?如果可以,如何实现?任何帮助或提示都会受到赞赏。

请确保您已经从最后一行中删除了 VerticalAlignmentHeight 属性设置。最后一行的内容是什么? - Bolu
此外,它可以工作,但实际上你不需要使用 180*,因为这是唯一剩下的行。你正在告诉网格将剩余的空间均匀地分成 180 部分,最后一行将占据所有部分(180)。只有在你有多行并且希望它们不均匀地占用剩余空间时才有意义(例如 1*(或只是 *)和 2* 意味着将其分成 3 部分,一个占其中的 1,另一个占其中的 2)。 - Bolu
3个回答

10

将height="*"放置在最后一行。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="220" />
        <RowDefinition Height="40" />
        <RowDefinition Height="80" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>


2
你所写的应该没问题(尽管正如@Bolu所评论的那样,在这种情况下180*可以被替换为*)。如果最后一行的内容没有扩展到填充可用空间,我会怀疑以下原因之一:
  1. Grid可能嵌套在布局面板下面,该面板不会排列其子元素以填充所有可用的垂直空间。例如,Grid面板的祖先之一是StackPanel吗?测试是否是罪魁祸首的一个好方法是将整个Grid注释掉,并将其替换为具有易于区分背景(例如Magenta)的Border,看它是否占据了您期望Grid填充的整个区域。

  2. 实际上可能没有任何内容在最后一行。您正确设置了Grid.Row值吗?

  3. 你可能正在覆盖最后一行内容的布局行为。您是否将内容的VerticalAlignment设置为除Stretch之外的其他值?


1

从最后一行中删除 Height 属性:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="220" />
        <RowDefinition Height="40" />
        <RowDefinition Height="80" />
        <RowDefinition/>
    </Grid.RowDefinitions>
<!-- some content -->
</Grid>

为了完整起见,Height="*" 也可以使用,并且具有略微不同的含义。 - Millie Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接