В моем приложении Xamarin Forms мне нужно иметь гибкий макет внутри другого гибкого макета. Это потому что:
- Мне нужно, чтобы в моем приложении было два столбца - один занимал 80% экрана, а другой занимал 20% экрана. Я использую FlexLayout с двумя детьми, для которых установлено свойство FlexLayout.Basis.
- В одном из столбцов мне нужно отобразить серию представлений, чтобы они обернулись, чтобы заполнить доступное пространство. Для этого я использую FlexLayout, установленный на Wrap.
Под этим макетом мне нужно отобразить некоторые другие элементы управления.
Моя проблема заключается в том, что FlexLayout, содержащий обернутые элементы управления, не корректно регулирует его высоту, а «нижние» элементы управления посягают на обернутый макет. Это пример проблемы (в Android):
![enter image description here](https://i.stack.imgur.com/dkXcZ.png)
Метка 11 скрыта кнопкой. Красная граница - это граница FlexLayout в средстве просмотра Android UI Automator. Высота, по-видимому, не регулируется в соответствии с добавленными элементами управления.
Если я удаляю столбец «Правая кнопка» и, следовательно, не нуждаюсь в свойствах гибкого базиса, он точно определяет размеры. Я думаю, что FlexLayout, содержащий обернутые элементы управления, не принимает во внимание тот факт, что он находится в столбце с шириной 80% - он, кажется, основывает свою высоту, как если бы он занимал всю ширину экрана. Кто-нибудь знает способ обойти это?
Вот xaml, чтобы воспроизвести проблему:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:FlexLayoutProb"
x:Class="FlexLayoutProb.MainPage">
<StackLayout HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
AutomationId="stackLayoutTop">
<FlexLayout
AutomationId="FlexLayoutTop"
HorizontalOptions="FillAndExpand"
VerticalOptions="Start"
>
<StackLayout AutomationId="stackLayoutLeft" FlexLayout.Basis="80%" HorizontalOptions="FillAndExpand" >
<FlexLayout
AutomationId="FlexLayoutCtrls"
HorizontalOptions="FillAndExpand"
VerticalOptions="Start"
Wrap="Wrap" BackgroundColor="LightGreen"
>
<Label HeightRequest="50" WidthRequest="100" Margin="5" BackgroundColor="LightCyan" Text="Label1"></Label>
<Label HeightRequest="50" WidthRequest="100" Margin="5" BackgroundColor="LightCyan" Text="Label2"></Label>
<Label HeightRequest="50" WidthRequest="100" Margin="5" BackgroundColor="LightCyan" Text="Label3"></Label>
<Label HeightRequest="50" WidthRequest="100" Margin="5" BackgroundColor="LightCyan" Text="Label4"></Label>
<Label HeightRequest="50" WidthRequest="100" Margin="5" BackgroundColor="LightCyan" Text="Label5"></Label>
<Label HeightRequest="50" WidthRequest="100" Margin="5" BackgroundColor="LightCyan" Text="Label6"></Label>
<Label HeightRequest="50" WidthRequest="100" Margin="5" BackgroundColor="LightCyan" Text="Label7"></Label>
<Label HeightRequest="50" WidthRequest="100" Margin="5" BackgroundColor="LightCyan" Text="Label8"></Label>
<Label HeightRequest="50" WidthRequest="100" Margin="5" BackgroundColor="LightCyan" Text="Label9"></Label>
<Label HeightRequest="50" WidthRequest="100" Margin="5" BackgroundColor="LightCyan" Text="Label10"></Label>
<Label HeightRequest="50" WidthRequest="100" Margin="5" BackgroundColor="LightCyan" Text="Label11"></Label>
</FlexLayout>
</StackLayout>
<StackLayout AutomationId="stackLayoutRight" FlexLayout.Basis="20%" HorizontalOptions="FillAndExpand">
<Button Text="Right Button" HorizontalOptions="FillAndExpand"></Button>
</StackLayout>
</FlexLayout>
<Button Text="Bottom Button"></Button>
</StackLayout>
</ContentPage>