2015-05-14 7 views
32

Есть ли способ создать вертикальную структуру стека с кнопкой, которая занимает 30% родительского элемента, и текстовый ввод, который принимает 70% родительского элемента ? Что-то вроде этого:Xamarin Forms StackLayout: Как установить ширину/высоту детей в процентах

<StackLayout Orientation="Vertical"> 
    <Entry Height="70%"></Entry> 
    <Button Height="30%">Click me</Button> 
</StackLayout> 

Но это не сработает. До сих пор единственным решением является создание полного элемента Grid и его использование. Нет ли других решений?

ответ

50

В этом сценарии StackLayout не очень хорошо справляется с разной высотой. Двигатели Xamarin Forms в этот момент не так округлены, как двигатель WPF. В общем, вы должны пойти

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="7*" /> 
     <RowDefinition Height="3*" /> 
    </Grid.RowDefinitions> 
    <Entry Grid.Row="0" VerticalOptions="Fill"></Entry> 
    <Button Grid.Row="1" VerticalOptions="Fill">Click me</Button> 
</Grid> 

Также как примечание стороны, только Сетки можно расширить до полной ширины или высоты родительского элемента. StackLayout определяет их максимальный размер на сумму своих детей, если они не находятся в Grid, и вы ставите HorizontalOptions="Fill" и VerticalOptions="Fill".

Единственный способ, которым вы могли бы это сделать, - получить DeviceHeight и Width от ОС и вручную установить высоты ваших элементов. Сложный и обычно ошибочный подход, который я не рекомендую.

+0

Благодарим вас за упоминание о том, что только сетки могут растягивать полный размер родителя. Я не знал этого, но я предположил, что Stack Layouts могут растягиваться, так как они занимают все пространство в моем приложении (но я думаю, что настоящая причина заключается в том, что я создал дочерние объекты с такими свойствами, как VerticalOptions = FillAndExpand) –

+0

«только сетки могут расширяться до полной ширины или высоты его родительского элемента ".... вы уверены? Что относительно VerticalOptions = LayoutOptions.FillAndExpand? Я только создал боковую панель, которая является stacklayout, и она правильно расширяет всю высоту экрана ... что мне не хватает? – jbyrd

+2

Механизм компоновки с того момента, когда я написал это (почти год назад), в значительной степени отличается от текущей версии, сделано много улучшений. Версия 2.0 (я думаю) включала в себя большие улучшения макета Engine Engine, я думаю, что они, возможно, даже переписали ее, но не уверены. –

0

В то время как вы можете сделать это с помощью сетки, есть более подходящий макет для него AbsoluteLayout

Вы можете установить позиции пропорции с этим: «. 5,1, 0,5, 0,1" AbsoluteLayout.LayoutBounds =