Параметры макета в Xamarin.Forms
Каждое Xamarin.Forms представление имеет свойства HorizontalOptions и VerticalOptions типа LayoutOptions. В этой статье объясняется, что каждое значение LayoutOptions имеет значение для выравнивания и расширения представления.
Обзор
Структура LayoutOptions
инкапсулирует два параметра макета:
- Выравнивание — предпочтительное выравнивание представления, которое определяет его положение и размер в родительском макете.
- Расширение — используется только для
StackLayout
представления и указывает, следует ли использовать дополнительное пространство, если оно доступно.
Эти параметры макета View
можно применить к View
родительскому объекту, задав HorizontalOptions
или VerticalOptions
свойство одного из общедоступных полей из LayoutOptions
структуры. Общедоступные поля приведены следующим образом:
Поля Start
, и End
Center
Fill
поля используются для определения выравнивания представления в родительском макете:
- Для горизонтального выравнивания
Start
позиций в левой части родительского макета и для вертикального выравнивания он размещаетсяView
View
в верхней части родительского макета. - Для горизонтального и вертикального выравнивания по
Center
горизонтали или по вертикалиView
. - Для горизонтального выравнивания
End
позиций в правой части родительского макета и для вертикального выравнивания он размещаетсяView
View
в нижней части родительского макета. - Для горизонтального выравнивания убедитесь,
Fill
чтоView
ширина родительского макета заполняется и для вертикального выравнивания гарантирует, чтоView
высота родительского макета заполняется.
Значения StartAndExpand
, EndAndExpand
и FillAndExpand
значения CenterAndExpand
используются для определения предпочтения выравнивания, и будет ли представление занимать больше места, если оно доступно в родительском StackLayout
элементе.
Примечание.
Значение по умолчанию свойств представления HorizontalOptions
и VerticalOptions
— LayoutOptions.Fill
.
Точное понимание
Выравнивание определяет, как представление размещается в родительском макете, если родительский макет содержит неиспользуемое пространство (то есть родительский макет больше объединенного размера всех дочерних элементов).
Только StackLayout
учитывает Start
поля , Center
End
и Fill
LayoutOptions
поля для дочерних представлений, которые находятся в противоположном направлении StackLayout
ориентации. Таким образом, дочерние представления в вертикально ориентированных StackLayout
представлениях могут задать их HorizontalOptions
свойства одному из Start
полей , Center
End
или Fill
полей. Аналогичным образом дочерние представления в горизонтально ориентированных StackLayout
представлениях могут задать их VerticalOptions
свойства одному из Start
полей , Center
End
или Fill
полей.
Не StackLayout
учитывает Start
поля и End
Center
поля для дочерних представлений, которые находятся в том же направлении, что StackLayout
и Fill
LayoutOptions
ориентация. Таким образом, вертикально ориентированный StackLayout
игнорирует Start
End
Center
поля или Fill
поля, если они заданы в VerticalOptions
свойствах дочерних представлений. Аналогичным образом горизонтально ориентированный StackLayout
игнорирует Start
End
Center
поля или Fill
поля, если они заданы в HorizontalOptions
свойствах дочерних представлений.
Примечание.
LayoutOptions.Fill
Обычно переопределяет запросы размера, указанные HeightRequest
с помощью и WidthRequest
свойства.
В следующем примере кода XAML показана вертикальная ориентация StackLayout
, в которой каждый дочерний Label
объект задает его HorizontalOptions
свойство одному из четырех полей выравнивания из LayoutOptions
структуры:
<StackLayout Margin="0,20,0,0">
...
<Label Text="Start" BackgroundColor="Gray" HorizontalOptions="Start" />
<Label Text="Center" BackgroundColor="Gray" HorizontalOptions="Center" />
<Label Text="End" BackgroundColor="Gray" HorizontalOptions="End" />
<Label Text="Fill" BackgroundColor="Gray" HorizontalOptions="Fill" />
</StackLayout>
Ниже приведен эквивалентный код на C#:
Content = new StackLayout
{
Margin = new Thickness(0, 20, 0, 0),
Children = {
...
new Label { Text = "Start", BackgroundColor = Color.Gray, HorizontalOptions = LayoutOptions.Start },
new Label { Text = "Center", BackgroundColor = Color.Gray, HorizontalOptions = LayoutOptions.Center },
new Label { Text = "End", BackgroundColor = Color.Gray, HorizontalOptions = LayoutOptions.End },
new Label { Text = "Fill", BackgroundColor = Color.Gray, HorizontalOptions = LayoutOptions.Fill }
}
};
Код приводит к макету, показанном на следующих снимках экрана:
Расширение
Расширение определяет, будет ли представление занимать больше места, если оно доступно, в пределах StackLayout
. StackLayout
Если содержит неиспользуемое пространство (тStackLayout
. е. больше объединенного размера всех дочерних элементов), неиспользуемое пространство совместно используется всеми дочерними представлениями, запрашивающими расширение, задавая их HorizontalOptions
или VerticalOptions
свойства LayoutOptions
в поле, использующее AndExpand
суффикс. Обратите внимание, что при использовании всего пространства StackLayout
параметры расширения не влияют.
StackLayout
может развернуть дочерние представления только в направлении своей ориентации. Таким образом, вертикально ориентированный StackLayout
может развернуть дочерние представления, которые задают их VerticalOptions
свойства одному из StartAndExpand
полей , EndAndExpand
CenterAndExpand
или FillAndExpand
полей, если StackLayout
содержит неиспользуемое пространство. Аналогичным образом горизонтально ориентированный StackLayout
может расширить дочерние представления, которые задают их HorizontalOptions
свойства одному из StartAndExpand
полей , CenterAndExpand
EndAndExpand
или FillAndExpand
полей, если StackLayout
содержит неиспользуемое пространство.
Невозможно StackLayout
развернуть дочерние представления в направлении, противоположном его ориентации. Таким образом, для вертикально ориентированного StackLayout
свойства для HorizontalOptions
дочернего представления StartAndExpand
имеется тот же эффект, что и установка свойства Start
в значение .
Примечание.
Обратите внимание, что включение расширения не изменяет размер представления, если оно не используется LayoutOptions.FillAndExpand
.
В следующем примере кода XAML показана вертикальная ориентация StackLayout
, в которой каждый дочерний Label
объект задает его VerticalOptions
свойство в одно из четырех полей расширения из LayoutOptions
структуры:
<StackLayout Margin="0,20,0,0">
...
<BoxView BackgroundColor="Red" HeightRequest="1" />
<Label Text="Start" BackgroundColor="Gray" VerticalOptions="StartAndExpand" />
<BoxView BackgroundColor="Red" HeightRequest="1" />
<Label Text="Center" BackgroundColor="Gray" VerticalOptions="CenterAndExpand" />
<BoxView BackgroundColor="Red" HeightRequest="1" />
<Label Text="End" BackgroundColor="Gray" VerticalOptions="EndAndExpand" />
<BoxView BackgroundColor="Red" HeightRequest="1" />
<Label Text="Fill" BackgroundColor="Gray" VerticalOptions="FillAndExpand" />
<BoxView BackgroundColor="Red" HeightRequest="1" />
</StackLayout>
Ниже приведен эквивалентный код на C#:
Content = new StackLayout
{
Margin = new Thickness(0, 20, 0, 0),
Children = {
...
new BoxView { BackgroundColor = Color.Red, HeightRequest = 1 },
new Label { Text = "StartAndExpand", BackgroundColor = Color.Gray, VerticalOptions = LayoutOptions.StartAndExpand },
new BoxView { BackgroundColor = Color.Red, HeightRequest = 1 },
new Label { Text = "CenterAndExpand", BackgroundColor = Color.Gray, VerticalOptions = LayoutOptions.CenterAndExpand },
new BoxView { BackgroundColor = Color.Red, HeightRequest = 1 },
new Label { Text = "EndAndExpand", BackgroundColor = Color.Gray, VerticalOptions = LayoutOptions.EndAndExpand },
new BoxView { BackgroundColor = Color.Red, HeightRequest = 1 },
new Label { Text = "FillAndExpand", BackgroundColor = Color.Gray, VerticalOptions = LayoutOptions.FillAndExpand },
new BoxView { BackgroundColor = Color.Red, HeightRequest = 1 }
}
};
Код приводит к макету, показанном на следующих снимках экрана:
Каждое Label
занимает одинаковое количество пространства в пределах StackLayout
. Но только последний Label
со значением свойства VerticalOptions
, равным FillAndExpand
, имеет другой размер. Кроме того, каждая из них Label
отделена небольшим красным BoxView
цветом, что позволяет легко просматривать пространство Label
.
Итоги
В этой статье объясняется, что каждое LayoutOptions
значение структуры имеет значение выравнивания и расширения представления относительно родительского элемента. Поля , и Fill
поля используются для определения выравнивания представления в родительском макете, а также полей , а StartAndExpand
CenterAndExpand
EndAndExpand
также FillAndExpand
полей для определения предпочтения выравнивания, а также для определения того, будет ли представление занимать больше места, если оно доступно, в пределах.StackLayout
Start
Center
End