站点图标 江湖人士

Xamarin.Forms学习历程(3)——Layout之二

Xamarin.Forms学习历程

Xamarin.Forms学习历程(3)——Layout之二,我们继续接上一期所说的。

三、RelativeLayout(相对布局)###

说到相对布局,不得不和大家谈谈iOS的AutoLayout,两者有很多的相似之处。我们先来回忆一下iOS的AutoLayout

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:<#(nonnull id)#>
                                                          attribute:<#(NSLayoutAttribute)#>
                                                          relatedBy:<#(NSLayoutRelation)#>
                                                             toItem:<#(nullable id)#>
                                                          attribute:<#(NSLayoutAttribute)#>
                                                         multiplier:<#(CGFloat)#>
                                                           constant:<#(CGFloat)#>]];

这是iOS里的基础版,还有VFL版,我习惯用VFL版,因为它更简洁,不过更简洁的应该是Masonry。其实就是一个公式:A的属性 = (B的属性 * multiplier)- constant;这是常用的。
我们来看看RelativeLayout里面的参数

XML版###

<BoxView Color="Green" WidthRequest="50" HeightRequest="50"
    RelativeLayout.XConstraint =
      "{ConstraintExpression Type=RelativeToParent,
                             Property=Width,
                             Factor=0.5,
                             Constant=-100}"
    RelativeLayout.YConstraint =
      "{ConstraintExpression Type=RelativeToParent,
                             Property=Height,
                             Factor=0.5,
                             Constant=-100}" />

不用解释了吧,和iOS的AutoLayout是不是很像,把公式套进去就好。

Xamarin.Forms学习历程

C#版####

layout.Children.Add(box, Constraint.RelativeToParent((parent) =>
    {
      return (.5 * parent.Width) - 100;
    }),
    Constraint.RelativeToParent((parent) =>
    {
        return (.5 * parent.Height) - 100;
    }),
    Constraint.Constant(50), Constraint.Constant(50));

C#版直接上公式,就是任性,可能你看的有点晕,就是(x,y,width,height),只是每个属性都对应了一个约束。

四、Grid(网格布局)###

这个布局和之前的布局都有所不同,我也是第一次接触。我们来看看它有什么稀奇的。说到网格,也就是Rows and Columns,主要是对这行和列宽度、高度的定义。主要有下列三种定义

XML版###

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="*" />
    <RowDefinition Height="*" />
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>
  <Label Text="Top Left" Grid.Row="0" Grid.Column="0" />
  <Label Text="Top Right" Grid.Row="0" Grid.Column="1" />
  <Label Text="Bottom Left" Grid.Row="1" Grid.Column="0" />
  <Label Text="Bottom Right" Grid.Row="1" Grid.Column="1" />
</Grid>

可以看出这里定义的是一个2*2的网格,在网格内对应位置填充label。

C#版####

var grid = new Grid();
grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star)});
grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star)});
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star)});
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star)});
var topLeft = new Label { Text = "Top Left" };
var topRight = new Label { Text = "Top Right" };
var bottomLeft = new Label { Text = "Bottom Left" };
var bottomRight = new Label { Text = "Bottom Right" };
grid.Children.Add(topLeft, 0, 0);
grid.Children.Add(topRight, 0, 1);
grid.Children.Add(bottomLeft, 1, 0);
grid.Children.Add(bottomRight, 1, 1);

这个重点还是多用,用用就习惯了。

五、ScrollView(滚动布局)###

这个我不多说了,看看代码你就懂了

XML版###

<ContentPage.Content>
    <ScrollView>
        <StackLayout>
            <BoxView BackgroundColor="Red" HeightRequest="600" WidthRequest="150" />
            <Entry />
        </StackLayout>
    </ScrollView>
</ContentPage.Content>

C#版####

var scroll = new ScrollView();
Content = scroll;
var stack = new StackLayout();
stack.Children.Add(new BoxView { BackgroundColor = Color.Red,   HeightRequest = 600, WidthRequest = 600 });
stack.Children.Add(new Entry());

Xamarin.Forms学习历程结语##

Xamarin.Forms五种界面布局我全都说完了,希望在我的描述下你能够领会些东西,总而言之,布局这一块还是要重点掌握StackLayout。欢迎各位大神指正。

退出移动版