Grid 用于创建表格布局。

基本行和列定义

<Grid>
  <!-- Define 3 columns with width of 100 -->
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="100"/>
    <ColumnDefinition Width="100"/>
    <ColumnDefinition Width="100"/>
  </Grid.ColumnDefinitions>
  <!-- Define 3 rows with height of 50 -->
  <Grid.RowDefinitions>
    <RowDefinition Height="50"/>
    <RowDefinition Height="50"/>
    <RowDefinition Height="50"/>
  </Grid.RowDefinitions>
  <!-- This is placed at the top left (first row, first column) -->
  <Button 
      Grid.Column="0"
      Grid.Row="0"
      Content="Top Left"/>
  <!-- This is placed at the top left (first row, second column) -->
  <Button 
      Grid.Column="1"
      Grid.Row="0"
      Content="Top Center"/>
  <!-- This is placed at the center (second row, second column) -->
  <Button 
      Grid.Column="1"
      Grid.Row="1"
      Content="Center"/>
  <!-- This is placed at the bottom right (third row, third column) -->
  <Button 
      Grid.Column="2"
      Grid.Row="2"
      Content="Bottom Right"/>
</Grid>

注意:以下所有示例仅使用列,但也适用于行

自动大小定义

可以使用 Auto 作为宽度/高度来定义列和行。自动尺寸将占用显示其内容所需的空间,而不再需要。
自动大小的定义可以与固定大小的定义一起使用。

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="50"/>
  </Grid.ColumnDefinitions>
  <!-- This column won't take much space -->
  <Button Grid.Column="0" Content="Small"/>
  <!-- This column will take much more space -->
  <Button Grid.Column="1" Content="This text will be very long."/>
  <!-- This column will take exactly 50 px -->
  <Button Grid.Column="2" Content="This text will be cut"/>
</Grid>

简单的星号定义

可以使用*定义列和行作为其宽度/高度。星号行/列将占用尽可能多的空间,无论其内容如何。
星号定义可以与固定和自动大小的定义一起使用。星号是默认值,因此可以省略列宽或行高。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="50"/>
    </Grid.ColumnDefinitions>
    <!-- This column will be as wide as it can -->
    <Button Grid.Column="0" Content="Small"/>
    <!-- This column will take exactly 50 px -->
    <Button Grid.Column="2" Content="This text will be cut"/>
</Grid>

比例星大小的定义

除了恒星占据尽可能多的空间这一事实外,恒星定义也是相互成正比的。如果没有提到其他内容,则每个星形定义将占用当前网格中其他星号的空间。

但是,可以通过简单地向其添加乘数来定义不同定义的大小之间的比率。因此,定义为 2*的列将是定义为*的列的两倍宽。单个单位的宽度是通过将可用空间除以乘数的总和来计算的(如果有,则将其计为 1)。
因此,将 3 列定义为*2**的网格将显示为 1 / 4,1 / 2,1 / 4。
一个有 2 列定义为 2*3*将呈现 2 / 5,3 / 5。

如果集合中有自动或固定定义,则首先计算这些定义,然后星形定义将占用剩余空间。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <!-- This column will be as wide as the third column -->
    <Button Grid.Column="0" Content="Small"/>
    <!-- This column will be twice as wide as the rest -->
    <Button Grid.Column="1" Content="This text will be very long."/>
    <!-- This column will be as wide as the first column -->
    <Button Grid.Column="2" Content="This text will may be cut"/>
</Grid>

列/行跨度

通过设置它的 Row / ColumnSpan,可以使控制范围超出它的单元格。值集是行数/列数 th

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <!-- This control will streach across most of the grid -->
    <Button Grid.Column="0" Grid.ColumnSpan="2" Content="Small"/>
    <Button Grid.Column="2" Content="This text will may be cut"/>
</Grid>