Содержание
Изначально, за основу этого контейнера компоновки была взята концепция модуля CSS FlexBox. Как и StackLayout
, FlexLayout
позволяет размещать элементы в строках или столбцах, но, при этом, имеет ряд особенностей, позволяющих создавать «гибкий» интерфейс.
Направление расположения элементов
Свойство Direction
контейнера FlexLayout
определяет направление и основную ось дочерних элементов. Это свойство может принимать следующие значения:
Значение | Описание |
Column |
Дочерние элементы упорядочиваются по вертикали (в столбец). Основная ось — Y |
ColumnReverse |
Дочерние элементы упорядочиваются по вертикали в обратном направлении. Основная ось — Y |
Row |
Дочерние элементы упорядочиваются по горизонтали (в строку). Основная ось — X |
RowReverse |
Дочерние элементы упорядочиваются по горизонтали в обратном направлении. Основная ось — X |
Например, разместим четыре кнопки в столбцах:
<FlexLayout Direction="Column"> <Button Text="Item 1" Background="Red"></Button> <Button Text="Item 2" Background="Aqua"></Button> <Button Text="Item 3" Background="Green"></Button> <Button Text="Item 4" Background="DarkOrange"></Button> </FlexLayout>
Теперь в столбец, но в обратном направлении (ColumnReverse
):
Как можно видеть по рисунку, ColumnReverse
приводит к тому, что элементы начинают размещаться снизу вверх. Аналогичным образом работают и два других значения свойства Direction
Direction = "Row"
Direction = "RowReverse"
Как и в случае со StackLayout
, мы можем управлять размерами элементов в контейнере, используя их собственные свойства HeightRequest
и WidthRequest
. При этом, если общий размер всех элементов будет больше, чем доступное в контейнере пространство, то дочерние элементы будут «сжиматься» таким образом, чтобы поместиться в контейнере. Например, рассмотрим следующий пример:
<FlexLayout Direction="RowReverse"> <Button Text="Item 1" WidthRequest="200" Background="Red"></Button> <Button Text="Item 2" WidthRequest="200" Background="Aqua"></Button> <Button Text="Item 3" WidthRequest="200" Background="Green"></Button> <Button Text="Item 4" WidthRequest="200" Background="DarkOrange"></Button> </FlexLayout>
Теперь запустим приложение и попробуем изменить ширину окна таким образом, чтобы его размер был явно меньше, чем ширина всех кнопок:
Перенос элементов
Не всегда необходимо и целесообразно, чтобы элементы в контейнере «сжимались». Чтобы дочерние элементы контейнера сохраняли свой размер по основной оси, мы можем использовать свойство Wrap
. Это свойство может принимать три значения:
Значение | Описание |
NoWrap |
Не переносить элементы (значение по умолчанию) |
Wrap |
Переносить элементы. В этом случае элементы сохраняют свой размер по основной оси |
Reverse |
Переносить элементы в обратном порядке |
Вернемся к нашему предыдущему примеру и установим для контейнера одно из значений свойства Wrap
:
<FlexLayout Direction="RowReverse" Wrap="Wrap"> <Button Text="Item 1" WidthRequest="200" Background="Red"></Button> <Button Text="Item 2" WidthRequest="200" Background="Aqua"></Button> <Button Text="Item 3" WidthRequest="200" Background="Green"></Button> <Button Text="Item 4" WidthRequest="200" Background="DarkOrange"></Button> </FlexLayout>
В этом случае, так как элементы располагаются в контейнере в строку, то каждый элемент будет сохранять свой размер по оси X, то есть приложение будет выглядеть вот так:
Распределение пространства между дочерними элементами (свойство JustifyContent)
Еще одним широко используемым свойством FlexLayout
является свойство JustifyContent
. Это свойство управляет тем, как будет распределяться свободное пространство между дочерними элементами контейнера вдоль основной оси и может принимать следующие значения:
Значение | Описание |
Start |
Значение по умолчанию. Элементы «прижимаются» к началу основной оси и всё свободное пространство контейнера остается только в одной стороны (например, справа, если значение Direction равно Column |
Center |
Все элементы выстраиваются в центре. Свободное пространство распределяется поровну слева и справа от элементов |
End |
Элементы «прижимаются» к концу основной оси и всё свободное пространство контейнера остается только в одной стороны (например, слева, если значение Direction равно Column |
SpaceBetween |
Элементы распределяются равномерно таким образом, чтобы первый элемент прижимался к началу оси, а последний — к концу оси. Свободное пространство распределяется равномерно между элементами |
SpaceAround |
Аналогично предыдущему значению, однако первый и последний элемент «отстают» от начала и конца основной оси на равное расстояние |
SpaceEvenly |
Все элементы располагаются равномерно по основной оси, причем, между элементами, а также сначала и с конча основной оси остается равное пространство |
Например, распределим дочерние элементы в контейнере, используя значение SpaceBetween
<FlexLayout Direction="RowReverse" Wrap="Wrap" JustifyContent="SpaceBetween"> <Button Text="Item 1" WidthRequest="200" Background="Red"></Button> <Button Text="Item 2" WidthRequest="200" Background="Aqua"></Button> <Button Text="Item 3" WidthRequest="200" Background="Green"></Button> <Button Text="Item 4" WidthRequest="200" Background="DarkOrange"></Button> </FlexLayout>
В итоге, мы получим вот такой внешний вид приложения:
Итого
Контейнер FlexLayout
имеет более широкие возможности настройки расположения дочерних элементов. Используя FlexLayout
, мы можем располагать элементы равномерно вдоль основной оси, приживать их к началу или концу основной оси, переносить или, наоборот, запретить перенос элементов в контейнере и т.д. В этой части мы рассмотрели только минимум тех свойств этого контейнера, которые нам показывают основные возможности FlexLayout
. По мере необходимости, мы будем также рассматривать и другие его свойства.