Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Используйте FlexLayout для стека или упаковки коллекции дочерних представлений.
Это Xamarin.FormsFlexLayout новое в Xamarin.Forms версии 3.0. Он основан на модуле макета гибкого прямоугольного ящика CSS, который называется гибким макетом или гибким полем, так как он включает в себя множество гибких параметров для размещения дочерних элементов в макете.
FlexLayout аналогично тому Xamarin.FormsStackLayout , что он может упорядочивать дочерние элементы по горизонтали и по вертикали в стеке. Однако он FlexLayout также может упаковать дочерние элементы, если слишком много, чтобы поместиться в одну строку или столбец, а также имеет множество вариантов ориентации, выравнивания и адаптации к различным размерам экрана.
FlexLayout является производным от Layout<View> и наследует свойство Children от типа IList<View>.
FlexLayout определяет шесть общедоступных привязываемых свойств и пять присоединенных привязываемых свойств, влияющих на размер, ориентацию и выравнивание дочерних элементов. (Если вы не знакомы с присоединенными привязываемыми свойствами, см. статью Присоединенные свойства.) Эти свойства подробно описаны в разделах ниже о привязываемых свойствах подробно и вложенных привязываемых свойствах. Однако эта статья начинается с раздела о некоторых распространенных сценариях FlexLayout использования, описывающих многие из этих свойств более неформальным образом. В конце статьи вы увидите, как объединить таблицы FlexLayout стилей CSS.
Основные сценарии использования
Пример программы содержит несколько страниц, демонстрирующих некоторые распространенные способы использования FlexLayout и позволяющие экспериментировать со своими свойствами.
Использование FlexLayout для простого стека
На странице "Простой стек " показано, как FlexLayout заменить его StackLayout более простой разметкой. Все в этом примере определяется на странице XAML. Содержит FlexLayout четыре дочерних элемента:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:FlexLayoutDemos"
x:Class="FlexLayoutDemos.SimpleStackPage"
Title="Simple Stack">
<FlexLayout Direction="Column"
AlignItems="Center"
JustifyContent="SpaceEvenly">
<Label Text="FlexLayout in Action"
FontSize="Large" />
<Image Source="{local:ImageResource FlexLayoutDemos.Images.SeatedMonkey.jpg}" />
<Button Text="Do-Nothing Button" />
<Label Text="Another Label" />
</FlexLayout>
</ContentPage>
Вот эта страница, запущенная на iOS, Android и универсальная платформа Windows:
Три свойства FlexLayout показаны в файле SimpleStackPage.xaml :
Свойство
Directionимеет значение перечисленияFlexDirection. Значение по умолчанию —Row. Задание свойстваColumnдля упорядоченияFlexLayoutдочерних элементов в одном столбце элементов.Если элементы в столбце расположены в
FlexLayoutстолбце, то, как сообщается,FlexLayoutимеется вертикальная основная ось и горизонтальная перекрестная ось.Свойство
AlignItemsимеет типFlexAlignItemsи указывает, как элементы выравниваются на крестовой оси. ПараметрCenterприводит к горизонтальному центру каждого элемента.Если вы использовали
StackLayoutнеFlexLayoutдля этой задачи, вы будете центрировать все элементы, назначивHorizontalOptionsсвойству каждого элементаCenter. СвойствоHorizontalOptionsне работает для дочернихFlexLayoutобъектов, но одноAlignItemsсвойство выполняет ту же цель. Если вам нужно, можно использовать присоединенное привязываемоеAlignSelfсвойство для переопределенияAlignItemsсвойства для отдельных элементов:<Label Text="FlexLayout in Action" FontSize="Large" FlexLayout.AlignSelf="Start" />С этим изменением этот
Labelэлемент расположен в левом краеFlexLayout, когда порядок чтения находится слева направо.Свойство
JustifyContentимеет типFlexJustifyи указывает, как элементы упорядочены на главной оси. ПараметрSpaceEvenlyвыделяет все левое вертикальное пространство одинаково между всеми элементами и выше первого элемента и ниже последнего элемента.Если вы использовали объект
StackLayout, необходимо назначитьVerticalOptionsсвойство каждого элемента дляCenterAndExpandдостижения аналогичного эффекта.CenterAndExpandНо параметр выделяет в два раза больше места между каждым элементом, чем до первого элемента и после последнего элемента. Параметр можно имитироватьCenterAndExpandVerticalOptions, задавJustifyContentдля свойстваFlexLayoutзначениеSpaceAround.
Эти FlexLayout свойства подробно рассматриваются в разделе "Привязываемые свойства" подробно ниже.
Использование FlexLayout для упаковки элементов
Страница упаковки фотографий примера демонстрирует, как FlexLayout упаковать дочерние элементы в дополнительные строки или столбцы. XAML-файл создает экземпляр FlexLayout и назначает два свойства:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="FlexLayoutDemos.PhotoWrappingPage"
Title="Photo Wrapping">
<Grid>
<ScrollView>
<FlexLayout x:Name="flexLayout"
Wrap="Wrap"
JustifyContent="SpaceAround" />
</ScrollView>
<ActivityIndicator x:Name="activityIndicator"
IsRunning="True"
VerticalOptions="Center" />
</Grid>
</ContentPage>
Свойство Direction этого FlexLayout параметра не задано, поэтому он имеет значение Rowпо умолчанию, то есть дочерние элементы расположены в строках, а основная ось — горизонтальная.
Свойство Wrap имеет тип FlexWrapперечисления. Если в строке слишком много элементов, то этот параметр свойства приводит к тому, что элементы будут обтекаться в следующую строку.
Обратите внимание, что FlexLayout это дочерний объект ScrollView. Если на странице слишком много строк, то ScrollView свойство по умолчанию Orientation Vertical позволяет прокручиваться по вертикали.
Свойство JustifyContent выделяет левое пространство на главной оси (горизонтальная ось), чтобы каждый элемент был окружен одинаковым объемом пустого пространства.
Файл программной части обращается к коллекции примеров фотографий и добавляет их в коллекцию Children FlexLayout:
public partial class PhotoWrappingPage : ContentPage
{
// Class for deserializing JSON list of sample bitmaps
[DataContract]
class ImageList
{
[DataMember(Name = "photos")]
public List<string> Photos = null;
}
public PhotoWrappingPage ()
{
InitializeComponent ();
LoadBitmapCollection();
}
async void LoadBitmapCollection()
{
using (WebClient webClient = new WebClient())
{
try
{
// Download the list of stock photos
Uri uri = new Uri("https://raw.githubusercontent.com/xamarin/docs-archive/master/Images/stock/small/stock.json");
byte[] data = await webClient.DownloadDataTaskAsync(uri);
// Convert to a Stream object
using (Stream stream = new MemoryStream(data))
{
// Deserialize the JSON into an ImageList object
var jsonSerializer = new DataContractJsonSerializer(typeof(ImageList));
ImageList imageList = (ImageList)jsonSerializer.ReadObject(stream);
// Create an Image object for each bitmap
foreach (string filepath in imageList.Photos)
{
Image image = new Image
{
Source = ImageSource.FromUri(new Uri(filepath))
};
flexLayout.Children.Add(image);
}
}
}
catch
{
flexLayout.Children.Add(new Label
{
Text = "Cannot access list of bitmap files"
});
}
}
activityIndicator.IsRunning = false;
activityIndicator.IsVisible = false;
}
}
Вот программа работает, постепенно прокручиваемая сверху вниз:
Макет страницы с помощью FlexLayout
Существует стандартный макет в веб-дизайне называется святой грааль , потому что это формат макета, который очень желателен, но часто трудно реализовать с совершенством. Макет состоит из верхнего колонтитула в верхней части страницы и нижнего колонтитула в нижней части страницы, что расширяется до полной ширины страницы. В центре страницы находится основное содержимое, но часто с столбцов меню слева от содержимого и дополнительных сведений (иногда называется в стороне) справа. В разделе 5.4.1 спецификации гибкого прямоугольника CSS описывается, как макет святой грааль можно реализовать с помощью гибкого прямоугольника.
На странице "Макет Святого Грааля" примера показана простая реализация этого макета с помощью одной FlexLayout вложенной в другую. Так как эта страница предназначена для телефона в книжном режиме, области слева и справа от области содержимого всего 50 пикселей:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="FlexLayoutDemos.HolyGrailLayoutPage"
Title="Holy Grail Layout">
<FlexLayout Direction="Column">
<!-- Header -->
<Label Text="HEADER"
FontSize="Large"
BackgroundColor="Aqua"
HorizontalTextAlignment="Center" />
<!-- Body -->
<FlexLayout FlexLayout.Grow="1">
<!-- Content -->
<Label Text="CONTENT"
FontSize="Large"
BackgroundColor="Gray"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center"
FlexLayout.Grow="1" />
<!-- Navigation items-->
<BoxView FlexLayout.Basis="50"
FlexLayout.Order="-1"
Color="Blue" />
<!-- Aside items -->
<BoxView FlexLayout.Basis="50"
Color="Green" />
</FlexLayout>
<!-- Footer -->
<Label Text="FOOTER"
FontSize="Large"
BackgroundColor="Pink"
HorizontalTextAlignment="Center" />
</FlexLayout>
</ContentPage>
Здесь выполняется:
Навигация и области в сторону отрисовываются BoxView слева и справа.
Первый FlexLayout в XAML-файле имеет вертикальную основную ось и содержит три дочерних элемента, расположенных в столбце. Это верхний колонтитул, текст страницы и нижний колонтитул. Вложенная FlexLayout ось имеет горизонтальную основную ось с тремя дочерними элементами, расположенными в строке.
В этой программе показаны три присоединенных привязываемых свойства:
OrderПрисоединенное привязываемое свойство устанавливается на первомBoxView. Это свойство является целым числом со значением по умолчанию 0. Это свойство можно использовать для изменения порядка макета. Как правило, разработчики предпочитают, чтобы содержимое страницы отображалось в разметке до элементов навигации и в сторону элементов.OrderЗадание свойства в первом значении меньше, чем другие братья и сестры, приводит к отображению в качестве первогоBoxViewэлемента в строке. Аналогичным образом можно убедиться, что элемент отображается последним, задавOrderсвойству значение больше его братьев и сестер.Присоединенное
Basisпривязываемое свойство устанавливается на двухBoxViewэлементах, чтобы дать им ширину в 50 пикселей. Это свойство имеет типFlexBasis, структура, которая определяет статическое свойство типаFlexBasisс именемAuto, которое является значением по умолчанию. Можно использоватьBasisдля указания размера пикселя или процента, указывающего, сколько места занимает элемент на главной оси. Он называется основой , так как он указывает размер элемента, который является основой для всех последующих макетов.Свойство
Growзадается в вложенныхLayoutиLabelдочерних элементах, представляющих содержимое. Это свойство имеет типfloatи имеет значение по умолчанию 0. Если задано положительное значение, все оставшееся пространство вдоль главной оси выделяется этому элементу и братьям и сестрам с положительными значениямиGrow. Пространство выделяется пропорционально значениям, как спецификация звезды в объектеGrid.Первое
Growприсоединенное свойство устанавливается на вложенныйFlexLayoutобъект, указывающий, что этоFlexLayoutзанимает все неиспользуемое вертикальное пространство внутри внешнегоFlexLayout. ВтороеGrowприсоединенное свойство устанавливается дляLabelпредставления содержимого, указывающее, что это содержимое занимает все неиспользуемое горизонтальное пространство внутри внутреннейFlexLayoutчасти.Существует также аналогичное
Shrinkприсоединенное привязываемое свойство, которое можно использовать, если размер дочерних элементов превышает размерFlexLayout, но оболочка не требуется.
Элементы каталога с помощью FlexLayout
Страница "Элементы каталога" в примере аналогична примеру 1 в разделе 1.1 спецификации CSS Flex Layout Box, за исключением того, что она отображает горизонтально прокручиваемую серию рисунков и описания трех обезьян:
Каждая из трех обезьян содержится FlexLayout в объекте Frame , который имеет явную высоту и ширину, и который также является дочерним элементом большего размера FlexLayout. В этом XAML-файле большинство свойств дочерних FlexLayout элементов указываются в стилях, но один из которых является неявным стилем:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:FlexLayoutDemos"
x:Class="FlexLayoutDemos.CatalogItemsPage"
Title="Catalog Items">
<ContentPage.Resources>
<Style TargetType="Frame">
<Setter Property="BackgroundColor" Value="LightYellow" />
<Setter Property="BorderColor" Value="Blue" />
<Setter Property="Margin" Value="10" />
<Setter Property="CornerRadius" Value="15" />
</Style>
<Style TargetType="Label">
<Setter Property="Margin" Value="0, 4" />
</Style>
<Style x:Key="headerLabel" TargetType="Label">
<Setter Property="Margin" Value="0, 8" />
<Setter Property="FontSize" Value="Large" />
<Setter Property="TextColor" Value="Blue" />
</Style>
<Style TargetType="Image">
<Setter Property="FlexLayout.Order" Value="-1" />
<Setter Property="FlexLayout.AlignSelf" Value="Center" />
</Style>
<Style TargetType="Button">
<Setter Property="Text" Value="LEARN MORE" />
<Setter Property="FontSize" Value="Large" />
<Setter Property="TextColor" Value="White" />
<Setter Property="BackgroundColor" Value="Green" />
<Setter Property="BorderRadius" Value="20" />
</Style>
</ContentPage.Resources>
<ScrollView Orientation="Both">
<FlexLayout>
<Frame WidthRequest="300"
HeightRequest="480">
<FlexLayout Direction="Column">
<Label Text="Seated Monkey"
Style="{StaticResource headerLabel}" />
<Label Text="This monkey is laid back and relaxed, and likes to watch the world go by." />
<Label Text=" • Doesn't make a lot of noise" />
<Label Text=" • Often smiles mysteriously" />
<Label Text=" • Sleeps sitting up" />
<Image Source="{local:ImageResource FlexLayoutDemos.Images.SeatedMonkey.jpg}"
WidthRequest="180"
HeightRequest="180" />
<Label FlexLayout.Grow="1" />
<Button />
</FlexLayout>
</Frame>
<Frame WidthRequest="300"
HeightRequest="480">
<FlexLayout Direction="Column">
<Label Text="Banana Monkey"
Style="{StaticResource headerLabel}" />
<Label Text="Watch this monkey eat a giant banana." />
<Label Text=" • More fun than a barrel of monkeys" />
<Label Text=" • Banana not included" />
<Image Source="{local:ImageResource FlexLayoutDemos.Images.Banana.jpg}"
WidthRequest="240"
HeightRequest="180" />
<Label FlexLayout.Grow="1" />
<Button />
</FlexLayout>
</Frame>
<Frame WidthRequest="300"
HeightRequest="480">
<FlexLayout Direction="Column">
<Label Text="Face-Palm Monkey"
Style="{StaticResource headerLabel}" />
<Label Text="This monkey reacts appropriately to ridiculous assertions and actions." />
<Label Text=" • Cynical but not unfriendly" />
<Label Text=" • Seven varieties of grimaces" />
<Label Text=" • Doesn't laugh at your jokes" />
<Image Source="{local:ImageResource FlexLayoutDemos.Images.FacePalm.jpg}"
WidthRequest="180"
HeightRequest="180" />
<Label FlexLayout.Grow="1" />
<Button />
</FlexLayout>
</Frame>
</FlexLayout>
</ScrollView>
</ContentPage>
Неявный стиль для Image параметров двух присоединенных привязываемых свойств Flexlayout:
<Style TargetType="Image">
<Setter Property="FlexLayout.Order" Value="-1" />
<Setter Property="FlexLayout.AlignSelf" Value="Center" />
</Style>
Параметр Order –1 приводит Image к отображению элемента в каждом из вложенных представлений независимо от его положения в коллекции FlexLayout дочерних элементов. Свойство AlignSelf Center приводит Image к центру в FlexLayoutпределах . Это переопределяет параметр AlignItems свойства, который имеет значение Stretchпо умолчанию, что означает, что Label дочерние элементы Button растянуты до полной ширины FlexLayout.
В каждом из трех FlexLayout представлений Label пустой элемент предшествует Buttonпараметру Grow 1. Это означает, что все дополнительное вертикальное пространство выделяется этому пустому Label, что эффективно толкает вниз Button .
Привязываемые свойства подробно
Теперь, когда вы видели некоторые распространенные приложения FlexLayout, свойства FlexLayout можно изучить более подробно.
FlexLayout определяет шесть привязываемых свойств, заданных в FlexLayout коде или XAML, для управления ориентацией и выравниванием. (Одно из этих свойств, Positionне рассматривается в этой статье.)
Вы можете поэкспериментировать с пятью оставшимися привязываемыми свойствами с помощью страницы "Эксперимент " примера. Эта страница позволяет добавлять или удалять дочерние элементы из списка FlexLayout и задавать сочетания пяти привязываемых свойств. Все дочерние FlexLayout элементы представляют Label собой представления различных цветов и размеров, при Text этом свойство имеет число, соответствующее его позиции в Children коллекции.
При запуске программы пять Picker представлений отображают значения по умолчанию этих пяти FlexLayout свойств. В FlexLayout нижней части экрана находятся три дочерних элемента:
Label Каждый из представлений имеет серый фон, показывающий пространство, выделенное для этого Label внутри FlexLayout. FlexLayout Фон самого себя Алиса Блю. Он занимает всю нижнюю область страницы, за исключением небольшого поля в левой и правой части.
Свойство Direction
Свойство Direction имеет тип FlexDirection, перечисление с четырьмя элементами:
ColumnColumnReverse(или "столбец-обратный" в XAML)Row(стандартный вариант);RowReverse(или "обратная строка" в XAML)
В XAML можно указать значение этого свойства с помощью имен элементов перечисления в нижнем регистре, верхнем регистре или смешанном регистре или использовать две дополнительные строки, отображаемые в скобках, которые совпадают с индикаторами CSS. (Строки с обратным столбцом и "обратным строкой" определяются в FlexDirectionTypeConverter классе, используемом анализатором XAML.)
Ниже приведена страница "Эксперимент" , показывающая (слева направо), Row направление, Column направление и ColumnReverse направление:
Обратите внимание, что для Reverse параметров элементы начинаются в правом или нижнем углу.
Свойство Wrap
Свойство Wrap имеет тип FlexWrap, перечисление с тремя элементами:
NoWrap(стандартный вариант);WrapReverse(или "оболочка-обратный" в XAML)
Слева направо эти экраны отображают NoWrapWrap Reverse параметры для 12 дочерних элементов:
Wrap Если для свойства задано NoWrap значение и основная ось ограничена (как и в этой программе), а основная ось недостаточно широка или высока, чтобы соответствовать всем дочерним элементам, FlexLayout попытки сделать элементы меньше, как показано на снимке экрана iOS. Вы можете управлять сжатием элементов с присоединенным привязываемым свойством Shrink .
Свойство JustifyContent
Свойство JustifyContent имеет тип FlexJustify, перечисление с шестью элементами:
Start(или "flex-start" в XAML) по умолчаниюCenterEnd(или "flex-end" в XAML)SpaceBetween(или пробел между" в XAML)SpaceAround(или "пространство вокруг" в XAML)SpaceEvenly
Это свойство указывает, как элементы расположены на главной оси, которая является горизонтальной осью в этом примере:
На всех трех снимках Wrap экрана для свойства задано Wrapзначение . Значение Start по умолчанию отображается на предыдущем снимке экрана Android. Снимок экрана iOS здесь показывает Center параметр: все элементы перемещаются в центр. Три других варианта, начиная с слова Space , выделяют дополнительное пространство, не занятое элементами. SpaceBetween выделяет пространство одинаково между элементами; SpaceAround помещает равное пространство вокруг каждого элемента, в то время как SpaceEvenly помещает равное пространство между каждым элементом и перед первым элементом и после последнего элемента в строке.
Свойство AlignItems
Свойство AlignItems имеет тип FlexAlignItems, перечисление с четырьмя элементами:
Stretch(стандартный вариант);CenterStart(или "flex-start" в XAML)End(или "flex-end" в XAML)
Это одно из двух свойств (другое существо AlignContent), указывающее, как дочерние элементы выровнены по оси между осью. В каждой строке дочерние элементы растянуты (как показано на предыдущем снимке экрана) или выровнены по начальной, центру или концу каждого элемента, как показано на следующих трех снимках экрана:
На снимке экрана iOS выровнены верхней части всех дочерних элементов. На снимках экрана Android элементы расположены по вертикали на основе самого высокого дочернего элемента. На снимке экрана UWP выровнены нижние части всех элементов.
Для любого отдельного элемента AlignItems параметр можно переопределить с присоединенным привязываемым свойством AlignSelf .
Свойство AlignContent
Свойство AlignContent имеет тип FlexAlignContent, перечисление с семью элементами:
Stretch(стандартный вариант);CenterStart(или "flex-start" в XAML)End(или "flex-end" в XAML)SpaceBetween(или пробел между" в XAML)SpaceAround(или "пространство вокруг" в XAML)SpaceEvenly
Например AlignItems, AlignContent свойство также выравнивает дочерние элементы на перекрестной оси, но влияет на все строки или столбцы:
На снимке экрана iOS обе строки находятся в верхней части экрана; на снимке экрана Android они в центре; и на снимке экрана UWP они находятся в нижней части экрана. Строки также могут быть разделены различными способами:
Не AlignContent действует, если существует только одна строка или столбец.
Вложенные привязываемые свойства подробно
FlexLayout определяет пять присоединенных привязываемых свойств. Эти свойства задаются на дочерних элементах FlexLayout и относятся только к этому конкретному дочернему элементу.
Свойство AlignSelf
AlignSelf Присоединенное привязываемое свойство имеет типFlexAlignSelf, перечисление с пятью элементами:
Auto(стандартный вариант);StretchCenterStart(или "flex-start" в XAML)End(или "flex-end" в XAML)
Для любого отдельного дочернего FlexLayoutэлемента этого свойства этот параметр переопределяет AlignItems свойство, заданное FlexLayout на самом себе. Параметр Auto по умолчанию означает использование AlignItems параметра.
Для элемента с именем label (или примеромLabel) можно задать AlignSelf свойство в коде следующим образом:
FlexLayout.SetAlignSelf(label, FlexAlignSelf.Center);
Обратите внимание, что нет ссылки на родительский FlexLayout Labelэлемент . В XAML вы задаете следующее свойство:
<Label ... FlexLayout.AlignSelf="Center" ... />
Свойство Order
Свойство Order имеет тип int. Значение по умолчанию равно 0.
Свойство Order позволяет изменить порядок упорядочения дочерних FlexLayout элементов. Как правило, дочерние элементы FlexLayout упорядочивания совпадают с тем же порядком, что они отображаются в Children коллекции. Вы можете переопределить этот порядок, задав присоединенное Order привязываемое свойство в целочисленное значение, отличное от нуля, для одного или нескольких дочерних элементов. Затем FlexLayout дочерние элементы упорядочивается на основе параметра Order свойства на каждом дочернем элементе, но дочерние элементы с Order одинаковым параметром упорядочивается в том порядке, в который они отображаются в Children коллекции.
Свойство "Основа"
Присоединенное Basis привязываемое свойство указывает объем пространства, выделенного дочернему элементу основной FlexLayout оси. Размер, указанный Basis свойством, — это размер вдоль основной оси родительского FlexLayoutэлемента. Таким образом, Basis указывает ширину дочернего элемента, если дочерние элементы расположены в строках или высоту, когда дочерние элементы расположены в столбцах.
Свойство Basis имеет тип FlexBasis, структуру. Размер можно указать в отдельных устройствах или в процентах от размера FlexLayout. Значение Basis свойства по умолчанию — это статическое свойство FlexBasis.Auto, которое означает, что используется запрошенная ширина или высота дочернего объекта.
В коде Basis можно задать свойство для именованных Label label 40 независимых от устройств единиц, таких как:
FlexLayout.SetBasis(label, new FlexBasis(40, false));
Второй аргумент FlexBasis конструктора называется isRelative и указывает, является ли размер относительным (true) или абсолютным (false). Аргумент имеет значение falseпо умолчанию, поэтому можно также использовать следующий код:
FlexLayout.SetBasis(label, new FlexBasis(40));
Неявное преобразование из float FlexBasis него определяется, поэтому его можно упростить еще дальше:
FlexLayout.SetBasis(label, 40);
Можно задать размер 25 % родительского FlexLayout элемента следующим образом:
FlexLayout.SetBasis(label, new FlexBasis(0.25f, true));
Это дробное значение должно находиться в диапазоне от 0 до 1.
В XAML можно использовать число для размера в единицах, независимых от устройств:
<Label ... FlexLayout.Basis="40" ... />
Или можно указать процент в диапазоне от 0 до 100%:
<Label ... FlexLayout.Basis="25%" ... />
Страница "Базовый эксперимент" примера позволяет экспериментировать со свойством Basis . На странице отображается завернутый столбец из пяти Label элементов с чередующимися цветами фона и переднего плана. Два Slider элемента позволяют указать Basis значения для второго и четвертого Labelэлементов:
Снимок экрана iOS слева показывает два Label элемента, которые получают высоту в независимых от устройства единицах. Экран Android показывает, что они получают высоты, которые являются частью общей высоты FlexLayout. Basis Если задано значение 100 %, то дочерний элемент имеет высоту FlexLayoutстолбца и будет завернут к следующему столбцу и занимает всю высоту этого столбца, как показано на снимке экрана UWP: отображается, как если бы пять дочерних элементов упорядочивали в строке, но они на самом деле расположены в пяти столбцах.
Свойство Grow
Присоединенное Grow привязываемое свойство имеет тип int. Значение по умолчанию равно 0, а значение должно быть больше или равно 0.
Свойство Grow играет роль, если Wrap для свойства задано NoWrap значение, а строка дочерних элементов имеет общую ширину меньше ширины FlexLayoutили столбец дочерних объектов имеет более короткую высоту.FlexLayout Свойство Grow указывает, как распределить оставшееся пространство между дочерними элементами.
На странице "Рост эксперимента" пять Label элементов чередующихся цветов расположены в столбце, а два Slider элемента позволяют настроить Grow свойство второго и четвертогоLabel. Снимок экрана iOS в левом углу отображает свойства по умолчанию Grow 0:
Если одному дочернему элементу присвоено положительное Grow значение, то этот ребенок занимает все оставшееся пространство, как показано на снимках экрана Android. Это пространство также можно выделить между двумя или более детьми. На снимке экрана Grow UWP свойство второго Label имеет значение 0,5, а свойство четвертого Label — 1,5, что Grow дает четвертое Label три раза больше оставшегося пространства, чем второйLabel.
Как дочернее представление использует это пространство, зависит от конкретного типа дочернего элемента. Для этого Labelтекст можно разместить в общем пространстве Label с помощью свойств HorizontalTextAlignment и VerticalTextAlignment.
Свойство сжатия
Присоединенное Shrink привязываемое свойство имеет тип int. Значение по умолчанию равно 1, а значение должно быть больше или равно 0.
Свойство Shrink играет роль, если Wrap свойству присвоено NoWrap значение, а агрегированная ширина строки дочерних элементов больше ширины FlexLayout, или совокупная высота одного столбца дочерних элементов больше высоты FlexLayout. FlexLayout Обычно эти дочерние элементы будут отображаться путем сужения их размеров. Свойство Shrink может указать, какие дочерние элементы имеют приоритет при отображении в полном объеме.
Страница "Сжатие эксперимента " создает FlexLayout одну строку из пяти Label дочерних элементов, для которых требуется больше места, чем FlexLayout ширина. Снимок экрана iOS слева показывает все Label элементы со значениями по умолчанию 1:
На снимке экрана Shrink Android значение второго Label имеет значение 0 и Label отображается в полной ширине. Кроме того, четвертый Label Shrink получает значение больше одного, и он сократился. Снимок экрана UWP показывает, что оба Label элемента имеют Shrink значение 0, чтобы разрешить их отображать в полном размере, если это возможно.
Можно задать как значения, так Grow и Shrink значения для удовлетворения ситуаций, когда агрегатные дочерние размеры иногда могут быть меньше или иногда больше размера FlexLayout.
Стилизация CSS с помощью FlexLayout
В связи FlexLayoutс ним можно использовать функцию стилизации CSS, представленную в Xamarin.Forms версии 3.0. Страница "Элементы каталога CSS" примера дублирует макет страницы "Элементы каталога", но с таблицей стилей CSS для многих стилей:
Исходный файл CatalogItemsPage.xaml содержит пять Style определений в своем Resources разделе с 15 Setter объектами. В файле CssCatalogItemsPage.xaml, который был сокращен до двух Style определений с четырьмя Setter объектами. Эти стили дополняют таблицу стилей CSS для свойств, которые Xamarin.Forms функция стилизации CSS в настоящее время не поддерживает:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:FlexLayoutDemos"
x:Class="FlexLayoutDemos.CssCatalogItemsPage"
Title="CSS Catalog Items">
<ContentPage.Resources>
<StyleSheet Source="CatalogItemsStyles.css" />
<Style TargetType="Frame">
<Setter Property="BorderColor" Value="Blue" />
<Setter Property="CornerRadius" Value="15" />
</Style>
<Style TargetType="Button">
<Setter Property="Text" Value="LEARN MORE" />
<Setter Property="BorderRadius" Value="20" />
</Style>
</ContentPage.Resources>
<ScrollView Orientation="Both">
<FlexLayout>
<Frame>
<FlexLayout Direction="Column">
<Label Text="Seated Monkey" StyleClass="header" />
<Label Text="This monkey is laid back and relaxed, and likes to watch the world go by." />
<Label Text=" • Doesn't make a lot of noise" />
<Label Text=" • Often smiles mysteriously" />
<Label Text=" • Sleeps sitting up" />
<Image Source="{local:ImageResource FlexLayoutDemos.Images.SeatedMonkey.jpg}" />
<Label StyleClass="empty" />
<Button />
</FlexLayout>
</Frame>
<Frame>
<FlexLayout Direction="Column">
<Label Text="Banana Monkey" StyleClass="header" />
<Label Text="Watch this monkey eat a giant banana." />
<Label Text=" • More fun than a barrel of monkeys" />
<Label Text=" • Banana not included" />
<Image Source="{local:ImageResource FlexLayoutDemos.Images.Banana.jpg}" />
<Label StyleClass="empty" />
<Button />
</FlexLayout>
</Frame>
<Frame>
<FlexLayout Direction="Column">
<Label Text="Face-Palm Monkey" StyleClass="header" />
<Label Text="This monkey reacts appropriately to ridiculous assertions and actions." />
<Label Text=" • Cynical but not unfriendly" />
<Label Text=" • Seven varieties of grimaces" />
<Label Text=" • Doesn't laugh at your jokes" />
<Image Source="{local:ImageResource FlexLayoutDemos.Images.FacePalm.jpg}" />
<Label StyleClass="empty" />
<Button />
</FlexLayout>
</Frame>
</FlexLayout>
</ScrollView>
</ContentPage>
Таблица стилей Resources CSS ссылается на первую строку раздела:
<StyleSheet Source="CatalogItemsStyles.css" />
Обратите внимание, что два элемента в каждом из трех элементов включают StyleClass параметры:
<Label Text="Seated Monkey" StyleClass="header" />
···
<Label StyleClass="empty" />
Эти селекторы относятся к селекторам в таблице стилей CatalogItemsStyles.css :
frame {
width: 300;
height: 480;
background-color: lightyellow;
margin: 10;
}
label {
margin: 4 0;
}
label.header {
margin: 8 0;
font-size: large;
color: blue;
}
label.empty {
flex-grow: 1;
}
image {
height: 180;
order: -1;
align-self: center;
}
button {
font-size: large;
color: white;
background-color: green;
}
Здесь приведены ссылки на несколько FlexLayout присоединенных привязываемых свойств. label.empty В селекторе вы увидите flex-grow атрибут, который стили пустымLabel, чтобы предоставить некоторое пустое пространство над атрибутомButton. image Селектор содержит order атрибут и align-self атрибут, оба из которых соответствуют FlexLayout присоединенным свойствам привязки.
Вы видели, что вы можете задать свойства непосредственно на объекте FlexLayout , и вы можете задать присоединенные привязываемые свойства на дочерних элементах FlexLayout. Кроме того, эти свойства можно задать косвенно с помощью традиционных стилей на основе XAML или стилей CSS. Важно знать и понимать эти свойства. Эти свойства являются тем, что делает действительно гибким FlexLayout .
FlexLayout с Xamarin.University
Xamarin.Forms Видео 3.0 Flex Layout














