В чем разница между Xamarin.LayoutOptions формы, особенно заполнить и расширить?
В Xamarin.Формы каждый View имеет два свойства HorizontalOptions и VerticalOptions. Оба типа LayoutOptions и может иметь одно из следующих значений:
LayoutOptions.StartLayoutOptions.CenterLayoutOptions.EndLayoutOptions.FillLayoutOptions.StartAndExpandLayoutOptions.CenterAndExpandLayoutOptions.EndAndExpandLayoutOptions.FillAndExpand
по-видимому, он управляет выравниванием вида на родительском виде. Но как именно поведение каждого отдельного варианта? А в чем разница между Fill и суффикс Expand?
2 ответов:
короткий ответ:
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.
здесь вы найдете соответствующие скриншоты с высоким разрешением.
в текущей версии Xamarin есть небольшая ошибка.Формы; может быть, это было там некоторое время.
CenterAndExpandобычно не расширяется, и работа вокруг него может быть запутанной.например, если у вас есть
StackLayoutзначениеCenterAndExpand, затем вы помещаете метку внутри, которая также имеет значениеCenterAndExpandвы ожидали бы метку, которая является полной ширинойStackLayout. Нет. Он не будет расширяться. Вы должны установитьStackLayoutна "FillAndExpand", чтобы получить вложенный объект ярлыка для расширения на всю ширинуStackLayout, затем скажите метке центрировать текст, а не сам объект, с помощьюHorizontalTextAlignment="Center". По моему опыту вам нужно, чтобы как родитель, так и вложенный ребенок были установлены вFillAndExpandесли вы действительно хотите, чтобы убедиться, что она расширяется, чтобы вместить.<StackLayout HorizontalOptions="FillAndExpand" Orientation="Vertical" WidthRequest="300"> <Label BackgroundColor="{StaticResource TileAlerts}" HorizontalOptions="FillAndExpand" Style="{StaticResource LabelStyleReversedLrg}" HorizontalTextAlignment="Center" Text="Alerts" />

Comments