Xamarin.Forms
Xamarinフォームレイアウト
サーチ…
ContentPresenter
テンプレートビューのレイアウトマネージャ。 ControlTemplate内で、表示するコンテンツの表示位置を示すために使用されます。
ContentView
単一の内容を持つ要素。 ContentViewは独自のものをほとんど使用していません。その目的は、ユーザー定義の複合ビューの基本クラスとして機能することです。
XAML
<ContentView>
<Label Text="Hi, I'm a simple Label inside of a simple ContentView"
HorizontalOptions="Center"
VerticalOptions="Center"/>
</ContentView>
コード
var contentView = new ContentView {
Content = new Label {
Text = "Hi, I'm a simple Label inside of a simple ContentView",
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center
}
};
フレーム
単一の子を含む要素で、いくつかのフレームオプションがあります。フレームのデフォルトのXamarin.Forms.Layout.Paddingが20です。
XAML
<Frame>
<Label Text="I've been framed!"
HorizontalOptions="Center"
VerticalOptions="Center" />
</Frame>
コード
var frameView = new Frame {
Content = new Label {
Text = "I've been framed!",
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center
},
OutlineColor = Color.Red
};
ScrollView
Content
あればスクロールできる要素。
ScrollView
はレイアウトが含まれており、オフスクリーンでスクロールできます。 ScrollView
は、キーボードが表示されているときに画面の表示部分に自動的に移動するビューを許可するためにも使用されます。
注意: ScrollViews
をネストしないでください 。さらに、 ScrollViews
は、 ListView
やWebView
ようなスクロールを提供する他のコントロールとネストすることはできません。
ScrollView
は簡単に定義できます。 XAMLの場合:
<ContentPage.Content>
<ScrollView>
<StackLayout>
<BoxView BackgroundColor="Red" HeightRequest="600" WidthRequest="150" />
<Entry />
</StackLayout>
</ScrollView>
</ContentPage.Content>
コード内の同じ定義:
var scroll = new ScrollView();
Content = scroll;
var stack = new StackLayout();
stack.Children.Add(new BoxView { BackgroundColor = Color.Red, HeightRequest = 600, WidthRequest = 600 });
stack.Children.Add(new Entry());
TemplatedView
コントロールテンプレートを使用してコンテンツを表示する要素、およびContentView
基本クラス。
AbsoluteLayout
AbsoluteLayout
、自身のサイズと位置に比例する子要素の位置とサイズを決定します。子ビューは、比例値または静的値を使用して配置およびサイズ設定することができ、比例および静的値を混合することができます。
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プロパティはレイアウトに比例します。
- Y プロポーショナル :Yプロパティはレイアウトに比例します。
AbsoluteLayoutコンテナのレイアウトを処理するプロセスは、最初は少し直感的に思えるかもしれませんが、少し使いこなすと分かります。子要素を作成したら、それらをコンテナ内の絶対位置に設定するには、3つの手順を実行する必要があります。 AbsoluteLayout.SetLayoutFlags()メソッドを使用して、要素に割り当てられたフラグを設定する必要があります。また、 AbsoluteLayout.SetLayoutBounds()メソッドを使用して、要素に範囲を割り当てることもできます。最後に、子要素を子コレクションに追加する必要があります。 Xamarin.FormsはXamarinとデバイス固有の実装の間の抽象化レイヤであるため、位置の値はデバイスのピクセルとは無関係にすることができます。これは、前述のレイアウトフラグが有効になる場所です。 Xamarin.Formsコントロールのレイアウトプロセスで定義した値を解釈する方法を選択できます。
グリッド
行と列に配置されたビューを含むレイアウト。
これは、XAMLの一般的なGrid
定義です。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*" />
<RowDefinition Height="*" />
<RowDefinition Height="200" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ContentView Grid.Row="0" Grid.Column="0"/>
<ContentView Grid.Row="1" Grid.Column="0"/>
<ContentView Grid.Row="2" Grid.Column="0"/>
<ContentView Grid.Row="0" Grid.Column="1"/>
<ContentView Grid.Row="1" Grid.Column="1"/>
<ContentView Grid.Row="2" Grid.Column="1"/>
</Grid>
コードで定義されている同じGrid
は、次のようになります。
var grid = new Grid();
grid.RowDefinitions.Add (new RowDefinition { Height = new GridLength(2, GridUnitType.Star) });
grid.RowDefinitions.Add (new RowDefinition { Height = new GridLength (1, GridUnitType.Star) });
grid.RowDefinitions.Add (new RowDefinition { Height = new GridLength(200)});
grid.ColumnDefinitions.Add (new ColumnDefinition{ Width = new GridLength (200) });
グリッドに項目を追加するには: XAML
:
<Grid>
<--DEFINITIONS...--!>
<ContentView Grid.Row="0" Grid.Column="0"/>
<ContentView Grid.Row="1" Grid.Column="0"/>
<ContentView Grid.Row="2" Grid.Column="0"/>
<ContentView Grid.Row="0" Grid.Column="1"/>
<ContentView Grid.Row="1" Grid.Column="1"/>
<ContentView Grid.Row="2" Grid.Column="1"/>
</Grid>
C#コードでは:
var grid = new Grid();
//DEFINITIONS...
var topLeft = new Label { Text = "Top Left" };
var topRight = new Label { Text = "Top Right" };
var bottomLeft = new Label { Text = "Bottom Left" };
var bottomRight = new Label { Text = "Bottom Right" };
grid.Children.Add(topLeft, 0, 0);
grid.Children.Add(topRight, 0, 1);
grid.Children.Add(bottomLeft, 1, 0);
grid.Children.Add(bottomRight, 1, 1);
Height
とWidth
、いくつかの単位があります。
- 自動 - 行または列の内容に合わせて自動的にサイズを変更します。 C#ではGridUnitType.Auto、XAMLではAutoと指定されています。
- 比例 - 残りのスペースの割合として列と行のサイズを設定します。値として指定され、C#ではGridUnitType.Star、XAMLでは#*として指定され、#が希望する値になります。 *で1つの行/列を指定すると、使用可能な領域がいっぱいになります。
- 絶対サイズ - 特定の固定高さと幅の値を持つ列と行のサイズを設定します。値として指定し、C#ではGridUnitType.Absolute、XAMLでは#を使用し、#を希望の値にします。
注意:列の幅の値は、デフォルトでXamarin.Formsに自動設定されています。つまり、幅は子のサイズから決定されます。これは、MicrosoftプラットフォームでのXAMLの実装とは異なります。既定の幅は*で、使用可能な領域を埋めることになります。
RelativeLayout
Layout
使用Constraints
その子をレイアウトします。
RelativeLayout
は、レイアウトまたは兄弟ビューのプロパティに関連したビューの配置およびサイズ設定に使用されます。 AbsoluteLayout
とは異なり、 RelativeLayout
は移動アンカーの概念がなく、レイアウトの下端または右端を基準に要素を配置する機能がありません。 RelativeLayout
は、それ自身の範囲外の位置指定要素をサポートしています。
XAMLのRelativeLayoutは次のようなものです:
<RelativeLayout>
<BoxView Color="Red" x:Name="redBox"
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent,
Property=Height,Factor=.15,Constant=0}"
RelativeLayout.WidthConstraint="{ConstraintExpression
Type=RelativeToParent,Property=Width,Factor=1,Constant=0}"
RelativeLayout.HeightConstraint="{ConstraintExpression
Type=RelativeToParent,Property=Height,Factor=.8,Constant=0}" />
<BoxView Color="Blue"
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView,
ElementName=redBox,Property=Y,Factor=1,Constant=20}"
RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToView,
ElementName=redBox,Property=X,Factor=1,Constant=20}"
RelativeLayout.WidthConstraint="{ConstraintExpression
Type=RelativeToParent,Property=Width,Factor=.5,Constant=0}"
RelativeLayout.HeightConstraint="{ConstraintExpression
Type=RelativeToParent,Property=Height,Factor=.5,Constant=0}" />
</RelativeLayout>
このコードで同じレイアウトを実現できます:
layout.Children.Add (redBox, Constraint.RelativeToParent ((parent) => {
return parent.X;
}), Constraint.RelativeToParent ((parent) => {
return parent.Y * .15;
}), Constraint.RelativeToParent((parent) => {
return parent.Width;
}), Constraint.RelativeToParent((parent) => {
return parent.Height * .8;
}));
layout.Children.Add (blueBox, Constraint.RelativeToView (redBox, (Parent, sibling) => {
return sibling.X + 20;
}), Constraint.RelativeToView (blueBox, (parent, sibling) => {
return sibling.Y + 20;
}), Constraint.RelativeToParent((parent) => {
return parent.Width * .5;
}), Constraint.RelativeToParent((parent) => {
return parent.Height * .5;
}));
StackLayout
StackLayout
は、ビューを水平または垂直の1次元線(「スタック」)で整理します。 StackLayout
内のViews
は、レイアウトオプションを使用してレイアウト内のスペースに基づいてサイズをStackLayout
できます。配置は、ビューのレイアウトおよびレイアウトオプションにオーダービューを追加することによって決定されます。
XAMLでの使用法
<StackLayout>
<Label Text="This will be on top" />
<Button Text="This will be on the bottom" />
</StackLayout>
コードでの使用
StackLayout stackLayout = new StackLayout
{
Spacing = 0,
VerticalOptions = LayoutOptions.FillAndExpand,
Children =
{
new Label
{
Text = "StackLayout",
HorizontalOptions = LayoutOptions.Start
},
new Label
{
Text = "stacks its children",
HorizontalOptions = LayoutOptions.Center
},
new Label
{
Text = "vertically",
HorizontalOptions = LayoutOptions.End
},
new Label
{
Text = "by default,",
HorizontalOptions = LayoutOptions.Center
},
new Label
{
Text = "but horizontal placement",
HorizontalOptions = LayoutOptions.Start
},
new Label
{
Text = "can be controlled with",
HorizontalOptions = LayoutOptions.Center
},
new Label
{
Text = "the HorizontalOptions property.",
HorizontalOptions = LayoutOptions.End
},
new Label
{
Text = "An Expand option allows one or more children " +
"to occupy the an area within the remaining " +
"space of the StackLayout after it's been sized " +
"to the height of its parent.",
VerticalOptions = LayoutOptions.CenterAndExpand,
HorizontalOptions = LayoutOptions.End
},
new StackLayout
{
Spacing = 0,
Orientation = StackOrientation.Horizontal,
Children =
{
new Label
{
Text = "Stacking",
},
new Label
{
Text = "can also be",
HorizontalOptions = LayoutOptions.CenterAndExpand
},
new Label
{
Text = "horizontal.",
},
}
}
}
};