在Silverlight网格布局定义中,“*”和“Auto”的区别是什么?

20

试图理解以下内容:

<Grid Name="Root">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
</Grid>

有人可以帮我解释一下上面片段中*和Auto之间的区别吗?

谢谢

3个回答

30

Auto 表示将此列/行的大小设置为其包含项的大小。

* 表示与其他指定为 * 的列/行共享剩余的可用空间。

实际上,* 等同于 1*。可以为宽度或高度指定 2*3* ... N*。Silverlight 使用的算法是对所有使用 * 的行的 N 值求和,然后为每行分配其适当的可用空间份额。例如:

<Grid.RowDefinitions>
    <RowDefinition Height="*" />
    <RowDefinition Height="2*" />
    <RowDefinition Height="3*" />
    <RowDefinition Height="Auto" />
</Grid.Definitions>

这首先确定第四行需要从其内容中提高的高度,并将其从完整可用高度中减去。剩余的高度将分配给*行。其中第一行获得1/6,第二行获得1/3,第三行获得可用高度的一半。


5

Auto会使每列的大小适应其中包含的内容。

*将使用最大可用空间。当您有一个“剩余”列希望调整为剩余的大小时,最好使用它。

未定义宽度的示例网格。

情况1:

Column 1  | Column 2  | Column 3
----------------------------------
100 Width | Auto      | 200 Width

在这种情况下,第二列的宽度可以是1到放入其中所需内容和网格宽度的最大空间任意值。如果将第二列更改为*并在整个网格上定义宽度,则会填充剩余空间以实现网格的宽度。如果您设置了两列为*并且定义了网格宽度,则它们将竞争剩余空间并将其分开。
通常,我最多只使用*一列(尽管这不是规则),如果我有一个设置为动态大小的控件,使得该列将填充其他列留下的任何空间。如果您想要特定大小的列用于动态大小的控件,并且希望某些列保持固定并定义一列扩展以填充其余控件,则这很棒。Auto不会在未填充剩余空间的空列或低内容列中执行此操作。
场景2(第3列包含100宽度的内容,网格总宽度为800):
Column 1  | Column 2  | Column 3  | Column 4
--------------------------------------------
100 Width | 200 Width | Auto      | *

然后第三列的宽度将只会自适应到100。第四列将会自适应到400以填满剩余空间。


Kelsey,谢谢你的回答。不幸的是,我只能标记一个作为答案。 - user203687

2

这个页面(虽然是来自Silverlight 2,但仍然有效)有一些使用网格的示例,并附有以下解释:

对于网格中的每一行,我们都有一个RowDefinition元素。所有行定义都包含在Grid.RowDefinitions元素中。我们的前两行高度为50像素,第三行的高度设置为“*”。这表示该行将占据网格中其他行未占用的全部空间。

和:

另一种选择是将宽度和/或高度设置为“auto”。这样,每个列/行都会更改其大小,以匹配其中控件的宽度/高度。例如:


ChrisF,感谢您的回答。不幸的是,我只能标记一个答案。 - user203687
@user203687 - 没问题。但是你可以投票的答案数量没有限制 :) - ChrisF

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