Xamarin.Forms: использовать относительные ограничения внутри сетки, но без относительного расположения? - PullRequest
0 голосов
/ 04 сентября 2018

Можно ли использовать ограничения, которые ссылаются на другие виды внутри без , когда они находятся внутри относительного макета?

Другими словами, есть ли способ сделать это:

<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>

... обратите внимание, что это сетка , а не внутри относительного макета, но с использованием ограничений RelativeLayout. Это возможно или что-то в этом роде?

1 Ответ

0 голосов
/ 05 сентября 2018

Нет, насколько я знаю, вы не можете применить ограничения 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.

Редактировать

Поскольку я упустил центральную точку, что Width и Height должны быть связаны с тем же свойством того же родительского объекта, позвольте мне расширить мой ответ.

Конечно, вы можете встроить 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 может быть довольно медленным. ( см. Здесь ).

...