Xamarin.Form 的 LayoutOptions(尤其是 Fill 和 Expand)之间有什么区别?

2024-02-02

在 Xamarin.Forms 中,每个View有两个属性HorizontalOptions and VerticalOptions。两者都是类型LayoutOptions并且可以具有以下值之一:

  • LayoutOptions.Start
  • LayoutOptions.Center
  • LayoutOptions.End
  • LayoutOptions.Fill
  • LayoutOptions.StartAndExpand
  • LayoutOptions.CenterAndExpand
  • LayoutOptions.EndAndExpand
  • LayoutOptions.FillAndExpand

显然它控制视图在父视图上的对齐方式。但每个选项的行为到底如何呢?两者有什么区别Fill和后缀Expand?


简短回答

Start, Center, End and Fill定义视图的在其空间内对齐.

Expand定义是否占用更多空间如果可供使用的话。

Theory

结构LayoutOptions控制两种不同的行为:

  1. 结盟: 视图如何在父视图中对齐?

    • Start:对于垂直对齐,视图移至顶部。对于水平对齐,这通常是左侧。 (但请注意,在具有从右到左语言设置的设备上,这是相反的方式,即右对齐。)
    • Center:视图居中。
    • End:通常视图是底部或右对齐的。 (当然,对于从右到左的语言,左对齐。)
    • Fill:这种对齐方式略有不同。该视图将拉伸到父视图的整个尺寸。

    但是,如果父级不大于其子​​级,您将不会注意到这些对齐方式之间有任何差异。对齐仅对具有额外可用空间的父视图很重要。

  2. 扩张: 如果可用,该元素会占用更多空间吗?

    • Suffix Expand:如果父视图大于其所有子视图的总大小,即有额外的空间可用,则该空间将在具有该后缀的子视图之间按比例分配。这些孩子会“占据”他们的空间,但不一定“填满”它。我们将在下面的示例中看看这种行为。
    • 无后缀:没有后缀的孩子Expand即使有更多可用空间,后缀也不会获得额外空间。

    同样,如果父视图不大于其子​​视图,则扩展后缀也不会产生任何差异。

Example

让我们看一下下面的示例,看看所有八个布局选项之间的区别。

该应用程序包含深灰色StackLayout有八个嵌套的白色按钮,每个按钮都标有其垂直布局选项。单击其中一个按钮时,会将其垂直布局选项分配给堆栈布局。这样我们就可以轻松测试视图与父级的交互,两者都具有不同的布局选项。

(最后几行代码添加了额外的黄色框。我们稍后会再讨论这一点。)

public static class App
{
    static readonly StackLayout stackLayout = new StackLayout {
        BackgroundColor = Color.Gray,
        VerticalOptions = LayoutOptions.Start,
        Spacing = 2,
        Padding = 2,
    };

    public static Page GetMainPage()
    {
        AddButton("Start", LayoutOptions.Start);
        AddButton("Center", LayoutOptions.Center);
        AddButton("End", LayoutOptions.End);
        AddButton("Fill", LayoutOptions.Fill);
        AddButton("StartAndExpand", LayoutOptions.StartAndExpand);
        AddButton("CenterAndExpand", LayoutOptions.CenterAndExpand);
        AddButton("EndAndExpand", LayoutOptions.EndAndExpand);
        AddButton("FillAndExpand", LayoutOptions.FillAndExpand);

        return new NavigationPage(new ContentPage {
            Content = stackLayout,
        });
    }

    static void AddButton(string text, LayoutOptions verticalOptions)
    {
        stackLayout.Children.Add(new Button {
            Text = text,
            BackgroundColor = Color.White,
            VerticalOptions = verticalOptions,
            HeightRequest = 20,
            Command = new Command(() => {
                stackLayout.VerticalOptions = verticalOptions;
                (stackLayout.ParentView as Page).Title = "StackLayout: " + text;
            }),
        });
        stackLayout.Children.Add(new BoxView {
            HeightRequest = 1,
            Color = Color.Yellow,
        });
    }
}

以下屏幕截图显示了单击八个按钮中每一个按钮时的结果。我们提出以下观察:

  • 只要家长stackLayout很紧(不Fill页面),每个的垂直布局选项Button可以忽略不计。
  • 垂直布局选项仅在以下情况下才重要stackLayout更大(例如通过Fill对齐)和各个按钮有Expand suffix.
  • 额外的空间在所有按钮之间均匀分布Expand后缀。为了更清楚地看到这一点,我们在每两个相邻按钮之间添加了黄色水平线。
  • 空间大于其请求高度的按钮不一定会“填充”它。在这种情况下,实际行为由它们的对齐控制。例如。它们要么在其空间的顶部、中心或按钮上对齐,要么完全填充它。
  • 所有按钮都跨越布局的整个宽度,因为我们只修改VerticalOptions.

在这里您可以找到相应的高分辨率屏幕截图。 https://docs.google.com/drawings/d/19400CzxB40toFhVxb8AXVHerr9_a6kEMM7kDDN0psQ8/edit?usp=sharing

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin.Form 的 LayoutOptions(尤其是 Fill 和 Expand)之间有什么区别? 的相关文章

随机推荐