源码地址:https://github.com/l2999019/DemoAppgit
能够Star一下,随意 - -github
很意外的,第一篇博文被博客园的编辑大哥置顶了.感谢.工具
评论也不少,褒贬不一,我仍是那句话.技术是从无到有的过程,就像一个刚出生的人 不是说他有个强大的爸爸 因此就能够一出生就上天.布局
.NET如此,JAVA亦如此.言尽于此,对于喷子 好自为之..post
好了,废话很少说,咱们开始本章的内容.学习
昨天学了内容页,固然就少不了内容页里面的布局,因此..spa
今天咱们主要学习Xamarin.Forms中提供的各种布局手段,如图:3d
Xamarin.Forms提供了5种布局,我这里只截取了4种,第五种是ScrollView,我的以为..这个的操做做用大于布局做用..因此本章就不讲了.调试
本篇很长...内容不少,且本身认为比较重要..你们耐心看
各类布局,Demo效果以下:
Xamarin.Forms Previewer是微软提供的能够不运行程序,直接预览界面效果的工具..
由于本章主要讲布局,因此用这个会比较方便,不用每次都运行调试.
嗯,这个工具.你们凑合用 - -,由于它自己比较麻烦且会有莫名BUG,不过用顺畅了 还不错.
VS2017直接按照下图方式打开便可,VS2015 - - 我暂时没辙...
效果以下:
好了,大功告成,
嗯..使用中有任何的错误 或者红色的错误提示,请从新生成程序集,或者在几个视图中跳转一下..通常都会好..(tips:这就是我说的小麻烦)
StackLayout
以线性的方式进行水平或垂直的视图布局。
咱们直接建立一个ContentPage.
而后添加以下Xaml代码:
<ContentPage.Content> <StackLayout Spacing="10" x:Name="layout"> <Button Text="StackLayout" VerticalOptions="Start" HorizontalOptions="FillAndExpand" /> <BoxView Color="Yellow" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" /> <BoxView Color="Green" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" /> <BoxView HeightRequest="75" Color="Blue" VerticalOptions="End" HorizontalOptions="Start" /> </StackLayout> </ContentPage.Content>
效果如图:
方向嘛..就是横向,和竖向.经过在StackLayout 中设置Orientation属性.
就两个选择,Horizontal(水平方向),Vertical(垂直方向)默认为Vertical
代码以下:
<StackLayout Spacing="10" x:Name="layout" Orientation="Horizontal"> <--这里是内容--> </StackLayout>
你们能够看到,我在StackLayout 中的控件里面加了2个属性:
VerticalOptions(垂直位置)
HorizontalOptions(水平位置)
这2个属性,要求传递LayoutOptions(布局选项)的枚举,咱们能够经过这里面的选择,来肯定咱们控件的位置.
在上面的定位属性后面,均可以加一个后缀AndExpand,嗯..举个例子 就是这样FillAndExpand
会产生什么效果呢?
它会根据屏幕的大小,和你布局中其余的内容,若是有空白位置就会由设置了AndExpand的自动填充.
若是多个属性都有AndExpand
则会平分空白的位置.
边距的设置很简单,设置StackLayout 的Spacing属性便可.
Spacing默认值为6
这个..写过HTML的朋友们都知道,绝对定位嘛..就是根据X Y轴的坐标 直接给出控件的位置.
嗯先上列子的xaml代码吧,以下:
<AbsoluteLayout> <Label Text="这里是数值定位" AbsoluteLayout.LayoutBounds="1,50,50,100" LineBreakMode="WordWrap" /> <Label Text="这里是按百分比例定位" AbsoluteLayout.LayoutBounds=".5,1,.5,.1" AbsoluteLayout.LayoutFlags="All" LineBreakMode="WordWrap" /> <BoxView Color="Olive" AbsoluteLayout.LayoutBounds="1,.5, 25, 100" AbsoluteLayout.LayoutFlags="PositionProportional" /> <BoxView Color="Red" AbsoluteLayout.LayoutBounds="0,.5,25,100" AbsoluteLayout.LayoutFlags="PositionProportional" /> <BoxView Color="Blue" AbsoluteLayout.LayoutBounds=".5,0,100,25" AbsoluteLayout.LayoutFlags="PositionProportional" /> </AbsoluteLayout>
效果以下:
下面咱们就来详细的讲解一下绝对定位布局相关的属性.
咱们若是在AbsoluteLayout中添加控件,会发现,全部的控件,都会多出一个命名空间,下面有2个属性,以下:
讲解这2个属性以前,咱们须要了解AbsoluteLayout中的2个概念,一个叫作比例值,一个叫绝对值.
其实从字面就能够看出来,比例值就是相似HTML的10%,20%之类的..绝对值就是相似HTML的5px,10px之类的
固然,咱们的Xamarin有所不一样. 比例值须要设置为.1(注意前面有个".", .1的意思就是10% ) 绝对值就很简单了 10, 100 ..直接给数字就行
从上面的例子咱们能够看到LayoutBounds是有4个值的.相似下面:
<Label Text="这里是数值定位" AbsoluteLayout.LayoutBounds="1,50,50,100" LineBreakMode="WordWrap" />
从左至右,依次表明的意思是:
X轴的位置,Y轴的位置,控件的宽度,控件的高度.
有了上面这些属性,咱们就能够很轻松的操控一个控件所在的位置和大小了.
上面咱们说过,是分比例值与绝对值的.那怎么设置这个呢,就是经过LayoutFlags这个属性.它有7个枚举值.以下:
Width
值做为比例值,将全部其余值解析为绝对值。X轴
和Y轴
做为比例解析,而控件大小值被做为绝对值解析。X轴
和Y轴
被做为绝对值解析。
嗯..相对定位,顾名思义..就是相对于某个控件来进行定位..也能够是整个布局
示例代码以下:
<RelativeLayout> <BoxView Color="Red" x:Name="redBox" RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height,Factor=.15,Constant=0}" RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent,Property=Width,Factor=1,Constant=0}" RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent,Property=Height,Factor=.8,Constant=0}" /> <BoxView Color="Blue" RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=redBox,Property=Y,Factor=1,Constant=20}" RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToView, ElementName=redBox,Property=X,Factor=1,Constant=20}" RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent,Property=Width,Factor=.5,Constant=0}" RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent,Property=Height,Factor=.5,Constant=0}" /> </RelativeLayout>
效果以下:
相对定位的东西比较复杂,仔细阅读吧.
(约束)
相对定位有个叫作约束的概念,因此咱们能够看到.在RelativeLayout的里面,全部的控件 都会出现下面几种属性
XConstraint ,YConstraint, WidthConstraint,HeightConstraint
其实看前面,你们就应该知道是X Y 宽 高.
里面的写法 相似于JSON,以下:
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=redBox,Property=Y,Factor=1,Constant=20}"
大口号前面定义ConstraintExpression,表明它为约束的表达式.
里面有5个属性,解释以下:
Gird表格布局,支持将视图排列成行和列。行和列能够设置为比例值或绝对值。
Gird布局不该该与传统的表格相混淆,而且他的做用并非呈现表格数据。
它不像HTML中的Table,Gird纯粹是为了布局内容。
例子代码以下:
<Grid> <Grid.RowDefinitions> <RowDefinition Height="4*" /> <RowDefinition Height="*" /> <RowDefinition Height="200" /> <RowDefinition Height="2*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="2*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <BoxView BackgroundColor="Red" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" 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" BackgroundColor="Cyan" Grid.ColumnSpan="2" /> <!--<Label Text="Bottom Right" Grid.Row="1" Grid.Column="1" />--> <BoxView BackgroundColor="Blue" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Row="2" Grid.Column="0" /> <BoxView BackgroundColor="Green" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Row="2" Grid.Column="1" Grid.RowSpan="2" /> <BoxView BackgroundColor="AliceBlue" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Row="3" Grid.Column="0" /> </Grid>
效果以下:
它是设置Grid行数的容器,应该放在Grid标签里面,例子以下:
<Grid> <Grid.RowDefinitions> <RowDefinition Height="4*" /> <RowDefinition Height="*" /> <RowDefinition Height="200" /> <RowDefinition Height="2*" /> </Grid.RowDefinitions> </Grid>
这样就设置了一个为4行的Grid,能够经过Height属性来设置它的高."*"号为百分比设置 2*表示为20%. 直接设置绝对值也能够,如例子中的Height="200"
它是设置Grid列数的容器,应该放在Grid标签里面,例子以下:
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="2*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> </Grid>
这样就设置了一个为2列的Grid,能够经过Width属性来设置它的高."*"号为百分比设置 2*表示为20%. 直接设置绝对值也能够,如Width="200"
很简单,直接在Grid中添加控件,并写好对应的行列就好了.以下
<Label Text="Top Right" Grid.Row="0" Grid.Column="1" />
那么,这个label控件就会显示在Grid中的第一行 第二列(注意:这里的行列都是从0开始)
跨行,跨列也很简单,以下:
<Label Text="Bottom Left" Grid.Row="1" Grid.Column="0" BackgroundColor="Cyan" Grid.ColumnSpan="2" />
<BoxView BackgroundColor="Green" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Row="2" Grid.Column="1" Grid.RowSpan="2" />
直接设置Grid.ColumnSpan与Grid.RowSpan 便可,HTML中的Table已经用过不少次了..我就很少解释了.
嗯..一样简单,直接设置Grid标签的ColumnSpacing与RowSpacing便可.以下:
<Grid ColumnSpacing="5" RowSpacing="10"> </Grid>
上面的列子就是行间距为10,列间距为5.
好了,到此,本篇的布局就结束了...
无论大家怎么说..是骂我坑也好..是说Xamarin不行也好..本系列都会坚持写完.
最后,感谢点推荐的兄弟们,感谢那些一直支持着个人朋友们,谢谢.