Silverlight网格布局定义中“*”和“自动”之间的区别是什么

时间:2010-05-21 18:37:17

标签: silverlight-4.0 silverlight

试图理解以下内容:

<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 个答案:

答案 0 :(得分:25)

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,第三个获得可用高度的1/2。

答案 1 :(得分:3)

Auto将使每个列的大小适合它所包含的任何内容。

*将耗尽最大可用空间量。当你有一个“遗留”列时,你最好只想调整剩下的东西。

示例网格宽度未定义。

情景1:

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

在这种情况下,第2列可以是介于1之间的任何内容,也可以是放入其中的任何内容,以及网格宽度可用的最大空间。如果第2列更改为*并且网格上定义的宽度作为整体,则会填充左侧空间以实现网格的宽度。如果您将两列设置为*,并且定义了网格宽度,那么它们将竞争左侧空间并将其拆分。

通常我只使用*一个列(尽管这不是一个规则)如果我有一个设置为动态大小的控件,那么列将填充由其他专栏。如果您希望特定大小的列用于动态大小的控件并且希望某些列保持固定并且定义一个列以扩展以填充控件的其余部分,那就太棒了。 Auto不会对空的或低内容列执行此操作,这些列实际上不会填充左侧空间。

场景2(第3栏包含100宽度的内容,网格的总宽度为800):

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

第3列只会大小为100宽度。第4列的大小将为400,以填充左侧空间。

答案 2 :(得分:1)

This page(诚然来自Silverlight 2,但它仍然有效)有一些使用网格的例子,并附有以下解释:

  

对于Grid中的每一行,我们都有一个RowDefinition元素。所有行定义都包含在Grid.RowDefinitions元素中。我们的前两行高50像素,第三行的高度设置为“*”。这表示该行将占用Grid中的整个位置,而不是其他行。

  

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