AbsoluteLayout

AbsoluteLayout 定位和調整與其自身大小和位置成比例的子元素或絕對值。可以使用比例值或靜態值來定位和調整子檢視,並且可以混合比例和靜態值。

StackOverflow 文件

XAML 中 AbsoluteLayout 的定義如下所示:

<AbsoluteLayout>
    <Label Text="I'm centered on iPhone 4 but no other device"
        AbsoluteLayout.LayoutBounds="115,150,100,100" LineBreakMode="WordWrap"  />
    <Label Text="I'm bottom center on every device."
        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" />
    <BoxView Color="Blue" AbsoluteLayout.LayoutBounds=".5,0,1,25"
        AbsoluteLayout.LayoutFlags="PositionProportional, WidthProportional" />
</AbsoluteLayout>

程式碼中的相同佈局如下所示:

Title = "Absolute Layout Exploration - Code";
var layout = new AbsoluteLayout();

var centerLabel = new Label {
Text = "I'm centered on iPhone 4 but no other device.",
LineBreakMode = LineBreakMode.WordWrap};

AbsoluteLayout.SetLayoutBounds (centerLabel, new Rectangle (115, 159, 100, 100));
// No need to set layout flags, absolute positioning is the default

var bottomLabel = new Label { Text = "I'm bottom center on every device.", LineBreakMode = LineBreakMode.WordWrap };
AbsoluteLayout.SetLayoutBounds (bottomLabel, new Rectangle (.5, 1, .5, .1));
AbsoluteLayout.SetLayoutFlags (bottomLabel, AbsoluteLayoutFlags.All);

var rightBox = new BoxView{ Color = Color.Olive };
AbsoluteLayout.SetLayoutBounds (rightBox, new Rectangle (1, .5, 25, 100));
AbsoluteLayout.SetLayoutFlags (rightBox, AbsoluteLayoutFlags.PositionProportional);

var leftBox = new BoxView{ Color = Color.Red };
AbsoluteLayout.SetLayoutBounds (leftBox, new Rectangle (0, .5, 25, 100));
AbsoluteLayout.SetLayoutFlags (leftBox, AbsoluteLayoutFlags.PositionProportional);

var topBox = new BoxView{ Color = Color.Blue };
AbsoluteLayout.SetLayoutBounds (topBox, new Rectangle (.5, 0, 100, 25));
AbsoluteLayout.SetLayoutFlags (topBox, AbsoluteLayoutFlags.PositionProportional);

var twoFlagsBox = new BoxView{ Color = Color.Blue };
AbsoluteLayout.SetLayoutBounds (topBox, new Rectangle (.5, 0, 1, 25));
AbsoluteLayout.SetLayoutFlags (topBox, AbsoluteLayoutFlags.PositionProportional | AbsoluteLayout.WidthProportional);

layout.Children.Add (bottomLabel);
layout.Children.Add (centerLabel);
layout.Children.Add (rightBox);
layout.Children.Add (leftBox);
layout.Children.Add (topBox);

Xamarin.Forms 中的 AbsoluteLayout 控制元件允許你指定螢幕上你希望子元素出現的確切位置,以及它們的大小和形狀(邊界)。

根據此過程中使用的 AbsoluteLayoutFlags 列舉,有幾種不同的方法可以設定子元素的邊界。該 AbsoluteLayoutFlags 列舉包含以下值:

  • 全部 :所有尺寸都是成比例的。
  • HeightProportional :身高成正比的佈局。
  • :沒有解釋。
  • PositionProportional :結合 XProportional 和 YProportional。
  • SizeProportional :結合 WidthProportional 和 HeightProportional。
  • WidthProportional :寬度與佈局成比例。
  • XProportional :X 屬性與佈局成比例。
  • YProportional :Y 屬性與佈局成比例。

使用 AbsoluteLayout 容器的佈局的過程起初可能看起來有點違反直覺,但稍微使用它會變得熟悉。建立子元素後,要將它們設定在容器中的絕對位置,你需要執行三個步驟。你將需要使用 AbsoluteLayout.SetLayoutFlags() 方法設定分配給元素的標誌。你還需要使用 AbsoluteLayout.SetLayoutBounds() 給元素賦予邊界的方法。最後,你需要將子元素新增到 Children 集合中。由於 Xamarin.Forms 是 Xamarin 和特定於裝置的實現之間的抽象層,因此位置值可以獨立於裝置畫素。這是前面提到的佈局標誌發揮作用的地方。你可以選擇 Xamarin.Forms 控制元件的佈局過程如何解釋你定義的值。