Xamarin.Forms:在Grid内使用相对约束但没有相对布局?

时间:2018-09-04 17:31:40

标签: xamarin.forms constraints relativelayout

是否可以使用约束中的其他视图而没有将它们包含在相对布局中?

换句话说,有没有办法做到这一点:

<ContentPage .... >
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition 
        RelativeLayout.HeightConstraint="{ConstraintExpression 
        Type=RelativeToParent,
        Property=Height,
        Factor=0.1,
        Constant=0}" />
     </Grid.RowDefinitions>

     <Grid.ColumnDefinitions>
       <ColumnDefinition 
         RelativeLayout.WidthConstraint="{ConstraintExpression 
         Type=RelativeToParent, 
         Property=Heigth, 
         Factor=0.1,
         Constant=0}"/>
     </Grid.ColumnDefinitions>
  </Grid>
</ContentPage>

...请注意,这是相对布局内的网格 not ,但是使用了RelativeLayout约束。这有可能吗?

1 个答案:

答案 0 :(得分:1)

不,据我所知,您不能将RelativeLayout约束应用于网格的行或列。

但是有一种非常简单的方法可以达到预期的效果:使用GridLength.Star。高度为*的所有行(列均保持不变)将具有相同高度。无论如何,高度为2*的行将是高度为*的行的两倍。

要声明一行高度为1/10的整个网格,只需使用以下行定义

<Grid.RowDefinitions>
    <RowDefinition Height="*" />
    <RowDefinition Height="9*" />
</Grid.RowDefinitions>

并等同于列

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

您使用的是9*,而不是10*,因为第一行(列)的*和其余的9*总计为10*其中* 1/10

编辑

由于我错过了一个中心点,WidthHeight应该绑定到父级的 same 属性,所以让我扩大答案。

当然,您可以将 Grid 本身嵌入到RelativeLayout中:

<RelativeLayout>
    <Grid RelativeLayout.WidthConstraint="{ConstraintExpression, Type=RelativeToParent, Property=Width}" 
          RelativeLayout.HeightConstraint="{ConstraintExpression, Type=RelativeToParent, Property=Width}">
        <!-- Elided -->
    </Grid>
</RelativeLayout>

这样,Grids width and height are bound to the same property将使Grid二次。在Grid中,您可以使用启动系统设置相对于网格的列和行。由于网格的宽度和高度相等,因此*行的高度将等于*列的宽度。这有帮助吗?

请注意:根据您的总体布局,RelativeLayout可能会很慢。 (see here)。