Xamarin.Formsでは、すべてのView
に2つのプロパティHorizontalOptions
およびVerticalOptions
があります。両方ともタイプLayoutOptions
であり、次の値のいずれかを持つことができます。
LayoutOptions.Start
LayoutOptions.Center
LayoutOptions.End
LayoutOptions.Fill
LayoutOptions.StartAndExpand
LayoutOptions.CenterAndExpand
LayoutOptions.EndAndExpand
LayoutOptions.FillAndExpand
どうやらそれは親ビューでのビューの配置を制御します。しかし、個々のオプションの動作はどのくらい正確ですか? Fill
とサフィックスExpand
の違いは何ですか?
Start
、Center
、End
、およびFill
は、そのスペース内のビューの位置合わせを定義します。
Expand
は、使用可能な場合にそれがより多くのスペースを占有するかどうかを定義します。
構造体LayoutOptions
は、2つの異なる動作を制御します。
Alignment:ビューは親ビュー内でどのように配置されますか?
Start
:垂直方向の配置の場合、ビューは上部に移動します。水平方向の配置の場合、これは通常左側です。 (ただし、右から左への言語設定を備えたデバイスでは、これは逆、つまり右揃えです)。Center
:ビューは中央揃えです。End
:通常、ビューは下または右揃えです。 (もちろん、右から左の言語では、左揃えです。)Fill
:この配置はわずかに異なります。ビューは、親ビューのフルサイズに拡大されます。ただし、親がその子より大きくない場合、これらの配置の違いに気付くことはありません。配置は、追加のスペースが利用可能な親ビューに対してのみ重要です。
拡張:利用可能な場合、要素はより多くのスペースを占有しますか?
Expand
:親ビューがそのすべての子の合計サイズよりも大きい場合、つまり追加のスペースが利用可能な場合、スペースはその接尾辞を持つ子ビューの間で比例します。それらの子供は自分のスペースを「占有」しますが、必ずしも「埋める」とは限りません。次の例で、この動作を確認します。Expand
接尾辞のない子は、使用可能なスペースがさらにある場合でも、追加のスペースを取得しません。繰り返しますが、親ビューがその子より大きくない場合、展開接尾辞も同様に違いはありません。
8つのレイアウトオプションすべての違いを確認するために、次の例を見てみましょう。
このアプリには、8つのネストされた白いボタンが付いたダークグレーの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,
});
}
}
次のスクリーンショットは、8つのボタンのそれぞれをクリックしたときの結果を示しています。次の観察を行います。
stackLayout
がタイトである限り(ページのFill
ではありません)、各Button
の垂直レイアウトオプションは無視できます。stackLayout
の方が大きく(たとえば、Fill
アライメントを使用)、個々のボタンにExpand
サフィックスが付いている場合にのみ重要です。Expand
接尾辞が付いたすべてのボタン間で最終的に比例します。これをより明確に見るために、隣接する2つのボタンの間に黄色の水平線を追加しました。VerticalOptions
のみを変更するため、すべてのボタンはレイアウトの幅全体に広がります。Xamarin.Formsの現在のバージョンには、少しバグがあります。多分それはしばらくそこにあった。
CenterAndExpand
は一般に展開されず、回避するのは混乱する可能性があります。
たとえば、StackLayout
がCenterAndExpand
に設定されている場合、CenterAndExpand
に設定されたラベルをその中に配置すると、StackLayout
の全幅のラベルが期待されます。いや。拡大しません。 StackLayout
を "FillAndExpand
"に設定して、ネストされたLabelオブジェクトをStackLayout
の全幅に拡張し、HorizontalTextAlignment="Center"
を使用して、Labelにオブジェクトとしてではなく、テキストを中央揃えにする必要があります。私の経験では、親とネストされた子の両方をFillAndExpand
に設定する必要があります。
<StackLayout HorizontalOptions="FillAndExpand"
Orientation="Vertical"
WidthRequest="300">
<Label BackgroundColor="{StaticResource TileAlerts}"
HorizontalOptions="FillAndExpand"
Style="{StaticResource LabelStyleReversedLrg}"
HorizontalTextAlignment="Center"
Text="Alerts" />