Короткий ответ
Start
, Center
, End
И Fill
определить вид по согласованности в ее пространстве .
Expand
определяет , занимает ли он больше места, если доступно.
теория
Структура LayoutOptions
контролирует два различных поведения:
Выравнивание. Как выравнивается представление в родительском представлении?
Start
: Для вертикального выравнивания вид перемещается вверх. Для горизонтального выравнивания это обычно левая сторона. (Но обратите внимание, что на устройствах с настройкой языка справа налево это наоборот, то есть выровнено по правому краю.)
Center
: Вид в центре.
End
: Обычно вид выровнен снизу или справа. (На языках справа налево, конечно, выравнивание по левому краю.)
Fill
: Это выравнивание немного отличается. Представление будет растянуто на весь размер родительского представления.
Если родитель, однако, не больше своих потомков, вы не заметите никакой разницы между этими выравниваниями. Выравнивание имеет значение только для родительских представлений с доступным дополнительным пространством.
Расширение: Будет ли элемент занимать больше места, если доступно?
- Суффикс
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
.
Здесь вы найдете соответствующие скриншоты в высоком разрешении.
FillAndExpand
это то, что вы хотите, 99% времениВ текущей версии Xamarin.Forms есть небольшая ошибка; возможно это было там некоторое время.
CenterAndExpand
как правило, не расширяется, и обходить его может сбить с толку.Например, если у вас есть
StackLayout
наборCenterAndExpand
, то вы помещаете метку внутри, которая также установлена наCenterAndExpand
вас, вы ожидаете, что метка будет иметь полную ширинуStackLayout
. Нет. Это не будет расширяться. Вы должны установитьStackLayout
«FillAndExpand
», чтобы заставить вложенный объект Label расширяться до полной шириныStackLayout
, а затем указать Label центрировать текст, а не сам объект как объектHorizontalTextAlignment="Center"
. По моему опыту, вам нужно установить родительский и вложенный дочерние элементы,FillAndExpand
если вы действительно хотите убедиться, что он расширяется, чтобы соответствовать.источник
Expand
используется только для детей StackLayout. Таким образом, если ваш StackLayout является корневым или нет в другом StackLayout,Expand
это никак не повлияет. Вместо этого любой параметр, кроме Fill, будет действовать как «содержимое переноса» для определения размера, что вы и видите.Фалько дал хорошее объяснение, но я хотел добавить к этому другой визуал и то, как эти теги работают в xaml, что я и предпочитаю использовать большую часть времени. Я сделал простой проект для проверки результатов отображения. Вот Xaml для главной страницы:
Как видите, это очень простой StackLayout с меткой внутри. Для каждого изображения ниже я оставил StackLayout одинаковым, я просто изменил горизонтальные и вертикальные параметры для записи и изменил текст, чтобы показать выбранные параметры, чтобы вы могли видеть, как запись перемещается и изменяет размеры.
Вот код, используемый для запуска:
И код, используемый для StartAndExpand:
Как видите, визуально нет никакой разницы, кроме того, что в опции StartAndExpand используется больше текста. Это было проверено на моем физическом устройстве Samsung A30. Они могут отображаться по-разному на разных устройствах, но я думаю, что все изображения здесь вместе показывают, что в Xamarin есть некоторые ошибки. В остальном я просто покажу скриншоты, думаю, они говорят сами за себя.
Я также рекомендую взглянуть на документацию Microsoft для некоторых дополнительных деталей. Следует отметить, что «Расширение используется только StackLayout».
источник