Xamarin.Forms布局讲解(三)

932 查看

Grid 介绍

Grid是一种横竖排列的布局,即九宫格。可以通过ColumnSpacingRowSpacing设置每行每列之间的间隙。Xaml定义时会先通过RowDefinitionsColumnDefinitions确定Grid行和列的数量,RowDefinition的Height属性表示每行的高度,ColumnDefinition的'Width'属性表示每列的宽度。Height和Width都是'GridLength'类型。


定义GridLength类型时可能会涉及到GridUnitType枚举类型的使用。


• Absolute—表示一个具体宽高值(device-independent units,在XAML中定义是用具体数字表示)
• Auto—表示宽高由内容决定 (在XAML中用“Auto” 表示)
• Star—余下的单元格按比例分配宽高 ( 在XAML中用“”表示或数字+“”)

XAML定义示例,定义一个两行两列的Grid,第一行的高度是90,第二行的高度是180,第一列宽度是自适应Cell的宽度,第二列是填充剩余宽度:

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="90" />
    <RowDefinition Height="180" />
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>

  ...

</Grid>

代码定义只要调用Grid的RowDefinitions和ColumnDefinitions的Add方法即可:



Grid的行和列定义完之后,就可以确定每个视图所在的行和列。
将Grid的Xaml定义修改如下:

<Grid>
      <Grid.RowDefinitions>
            <RowDefinition Height="90" />
            <RowDefinition Height="180" />
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
      </Grid.ColumnDefinitions>

      <Label Text="Top Left" Grid.Row="0" Grid.Column="0" BackgroundColor="Aqua"/>
      <Label Text="Top Right" Grid.Row="0" Grid.Column="1" BackgroundColor="Yellow"/>
      <Label Text="Bottom Left" Grid.Row="1" Grid.Column="0" BackgroundColor="Lime"/>
      <Label Text="Bottom Right" Grid.Row="1" Grid.Column="1" BackgroundColor="Red"/>
</Grid>

预览中IOS的效果如下:


子视图所在的位置是由Grid.RowGrid.Column两个属性确定的(Grid提供的附加属性),两个属性的默认值都为0,即默认位置第一行的第一列。对于这两个属性有很灵活的代码设置方法。
可以通过Grid对象Children属性的Add方法添加视图时指定


其中view是我们要添加的视图,left和top对应Grid.Column和Grid.Row。

除此之外还可以用Grid提供的静态方法Grid.SetColumnGird.SetRow方法指定子视图的位置。调用如下


view表示子视图,第二个参数表示设置的值。

观察SetColumn的方法实现:


方法中调用了第一参数的SetValue方法。Forms中的所有视图都是BindableObject(特殊类型先不做介绍)类型的,继承关系是:
View
 VisualElement
  Element
   BindableObject
所以可以直接调用子视图的SetValue方法设置:


还有两个附加属性Grid.ColumnSpanGrid.RowSpan表示子视图占据Grid的多少空间(几列和几行),Grid.ColumnSpan="2"表示占2列。使用与Grid.RowGrid.Column类似。