你会发现蓝色的StackLayout在各个Labelviews之间的空间中窥视。 这是StackLayout的默认Spacing属性的结果。 通过Color.Default标签,StackLayout也是可见的,它具有透明背景。
尝试将所有标签视图的HorizontalOptions属性设置为LayoutOptions.Start:
点击(此处)折叠或打开
-
return new Label
-
{
-
Text = name,
-
TextColor = color,
-
FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)),
-
BackgroundColor = backgroundColor,
-
HorizontalOptions = LayoutOptions.Start
- };
现在从Label中移除HorizontalOptions设置,并在StackLayout上设置HorizontalOptions:
点击(此处)折叠或打开
-
StackLayout stackLayout = new StackLayout
-
{
-
BackgroundColor = Color.Blue,
-
HorizontalOptions = LayoutOptions.Start
- };
当你开始构建一个可视对象树时,这些对象获得一个父子关系。父对象有时被称为其子项的容器,因为子项的位置和大小包含在其父项中。
默认情况下,HorizontalOptions和VerticalOptions设置为LayoutOptions.Fill,其中
意味着每个子视图都试图填充父容器。 (至少与容器到目前为止遇到过。正如你所看到的,其他的布局类有几分不同的行为。)即使一个标签默认填充其父容器,尽管没有背景颜色,标签似乎只占据尽可能多的空间因为它需要。
将视图的HorizontalOptions或VerticalOptions属性设置为LayoutOptions.Start,Center或End可以有效地强制视图向下缩小 - 水平,垂直或两者缩小至视图所需的大小。
StackLayout在其子级的垂直尺寸上具有相同的效果:StackLayout中的每个子级只占用其所需的高度。将StackLayout的子项的VerticalOptions属性设置为Start,Center或End不起作用!但是,子视图仍然会展开以填充StackLayout的宽度,除非子级被赋予HorizontalOptions属性而不是LayoutOptions.Fill。
如果将StackLayout设置为ContentPage的Content属性,则可以在StackLayout上设置HorizontalOptions或VerticalOptions。这些属性有两个作用:首先,它们将StackLayout宽度或高度(或两者)缩小为其子级大小;其次,它们决定了StackLayout相对于页面的位置。
如果StackLayout位于ScrollView中,ScrollView将使StackLayout只与其子级高度的总和一样高。这是ScrollView如何确定如何垂直滚动StackLayout。您可以继续在StackLayout上设置HorizontalOptions属性来控制宽度和水平位置。
但是,您应该避免将ScrollView上的VerticalOptions设置为LayoutOptions-.Start,Center或End。 ScrollView必须能够滚动它的子内容,并且ScrollView可以做到的唯一方法是通过强制它的子元素(通常是StackLayout)来设定一个高度,该高度仅反映孩子需要的高度,然后使用这个孩子的高度和它自己的高度来计算滚动该内容的量。如果将ScrollView上的VerticalOptions设置为LayoutOptions.Start,Center或End,则可以有效地告诉ScrollView只有它应该达到的高度。但那是什么高度?因为ScrollView可以滚动它的内容,所以它不需要任何特定的高度,所以理论上它会缩小到无。 Xamarin.Forms可以保护您免受这种可能性的影响,但您最好避免使用暗示您不想发生的事情的代码。
尽管在ScrollView中放置StackLayout是正常的,但将ScrollView放入StackLayout似乎并不正确。 从理论上讲,StackLayout将强制ScrollView的高度仅为需要的高度,而所需的高度基本上为零。 同样,Xamarin.Forms可以防止这种可能性,但是您应该避免使用这种代码。
有一种合适的方式可以将ScrollView放入StackLayout中,这与Xamarin.Forms布局原则完全一致,并且很快就会演示。
前面的讨论适用于垂直定向的StackLayout和ScrollView元素。 StackLayout有一个名为Orientation的属性,您可以将其设置为StackOrientation枚举的成员 - 垂直(默认)或水平。 同样,ScrollView也有一个方向属性,您可以将其设置为ScrollOrientation枚举的成员。 尝试这个:
点击(此处)折叠或打开
-
public ReflectedColorsPage()
-
{
-
StackLayout stackLayout = new StackLayout
-
{
-
Orientation = StackOrientation.Horizontal
-
};
-
…
-
Content = new ScrollView
-
{
-
Orientation = ScrollOrientation.Horizontal,
-
Content = stackLayout
-
};
- }

它使用默认的垂直布局选项看起来很奇怪,但可以修复它们使其看起来更好一些。