小编典典

Xamarin.Form 的 LayoutOptions 有什么区别,尤其是 Fill 和 Expand?

all

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

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

显然它控制视图在父视图上的对齐方式。但是每个选项的行为究竟如何?Fill和suffix 和有什么不一样Expand


阅读 72

收藏
2022-08-05

共1个答案

小编典典

简短的回答

Start, Center,EndFill定义视图 在其空间内的对齐方式

Expand定义 它是否占用更多空间 (如果可用)。

理论

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

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

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

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

  1. 扩展: 如果可用,元素会占用更多空间吗?

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

同样,如果父视图不大于其子​​视图,则扩展后缀也没有任何区别。

例子

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

该应用程序包含一个带有八个嵌套白色按钮的深灰色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后缀时才重要。
  • 额外的空间在所有带Expand后缀的按钮之间按比例分配。为了更清楚地看到这一点,我们在每两个相邻按钮之间添加了黄色水平线。
  • 空间大于其请求高度的按钮不一定“填充”它。在这种情况下,实际行为由它们的对齐方式控制。例如,它们要么在其空间的顶部、中心或按钮上对齐,要么完全填充。
  • 所有按钮跨越布局的整个宽度,因为我们只修改VerticalOptions.

截图

在这里您可以找到相应的高分辨率屏幕截图。

2022-08-05