元素未在Xamarin.Forms中扩展

时间:2019-04-22 03:35:52

标签: android xamarin.forms

使用StartAndExpandEndAndExpand似乎并没有真正扩展StackLayout中的元素。即使有更多可用空间,如蓝色区域所示。只有FillAndExpand有效。

代码如下:

<?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:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
             xmlns:local="clr-namespace:App6"
             x:Class="App6.MainPage"
             ios:Page.UseSafeArea="True">

    <StackLayout BackgroundColor="Blue"
                 HeightRequest="100"
                 Orientation="Horizontal"
                 Spacing="0"
                 VerticalOptions="Start">
        <Label BackgroundColor="Red"
               HorizontalOptions="Start"
               Text="Hi" />
        <StackLayout BackgroundColor="Salmon"
                     HorizontalOptions="EndAndExpand"
                     Orientation="Vertical">
            <BoxView BackgroundColor="Red"
                     HeightRequest="30"
                     HorizontalOptions="End"
                     VerticalOptions="Center"
                     WidthRequest="30" />
        </StackLayout>
    </StackLayout>
</ContentPage>

这就是我得到的:

enter image description here

最常见的结果是对子项FillAndExpand使用StackLayout时,后面是EndAndExpand,后者没有扩展,最后是StartAndExpand,也没有扩展。

如果父元素具有更多空间,是否不应该扩展该元素?如果是,为什么StartAndExpandEndAndExpand不起作用?

注意:仅在Android上使用Xamarin.Forms 3.4.0.1008975版进行了测试。

2 个答案:

答案 0 :(得分:2)

原因::在stackLayout中添加标签时,stackLayout不会使子视图适合该大小。

解决方案:

将标签放入网格中。请参考以下代码。

例如:如果要将标签“ Hi”设置为屏幕宽度的一半

<Grid BackgroundColor="Blue" >
    <Grid.RowDefinitions>
        <RowDefinition Height="100" />
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Label  HeightRequest="100" Grid.Row="0" Grid.Column="0"  Text="Hi" BackgroundColor="Red" />
    <BoxView  Grid.Row="0" Grid.Column="1" BackgroundColor="Red"
                 HeightRequest="30"
                 HorizontalOptions="End"
                 VerticalOptions="Center"
                 WidthRequest="30"/>

</Grid>

答案 1 :(得分:1)

请参阅@AndroDevil注释,该空间实际上是在StackLayout的子元素之间分配的,但是它们无法填充它,除非其布局选项包含Fill。它的工作方式与FlexLayout在选项之间的空间差不多。

我刚刚在StackLayout中添加了另一个元素,现在更清楚了。

代码如下:

<?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:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
             xmlns:local="clr-namespace:App6"
             x:Class="App6.MainPage"
             ios:Page.UseSafeArea="True">

    <StackLayout BackgroundColor="Blue"
                 HeightRequest="100"
                 Orientation="Horizontal"
                 Spacing="0"
                 VerticalOptions="Start">
        <Label BackgroundColor="Red"
               HorizontalOptions="Start"
               Text="Hi" />

        <Label BackgroundColor="Red"
               HorizontalOptions="EndAndExpand"
               Text="Bye" />

        <StackLayout BackgroundColor="Salmon"
                     HorizontalOptions="EndAndExpand"
                     Orientation="Vertical">
            <BoxView BackgroundColor="Red"
                     HeightRequest="30"
                     HorizontalOptions="End"
                     VerticalOptions="Center"
                     WidthRequest="30" />
        </StackLayout>
    </StackLayout>
</ContentPage>

这就是我得到的:

enter image description here

所以Expand的含义如下:

  • StartAndExpand:给我更多空间,但请把我放在左边。
  • CenterAndExpand:给我更多空间,但请把我放在中间。
  • EndAndExpand:给我更多空间,但请把我放在右边。
  • FillAndExpand:请给我更多空间,我要填满。