2016-10-12 3 views
1

Я пытаюсь создать следующий элемент пользовательского интерфейса с Xamarin.Forms. Я смог построить это с помощью UWP, привязав имущество Height от TopGrid до ActualWidth недвижимости Button1. Однако это не работает в Xamarin.Forms, потому что нет ActualWidth. Я уже пробовал привязать Height от TopGrid до WidthRequest, но безуспешно.Xamarin.Forms связывает высоту сетки с шириной кнопки

enter image description here

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Grid x:Name="TopGrid" Grid.Row="0" BindingContext="{x:Reference Name=Button1}" Height="{Binding Path=WidthRequest}"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <Button x:Name="Button1" Grid.Column="0" Text="1" /> 
     <Button x:Name="Button2" Grid.Column="1" Text="2" /> 
     <Button x:Name="Button3" Grid.Column="2" Text="3" /> 
     <Button x:Name="Button4" Grid.Column="3" Text="4" /> 
    </Grid> 
</Grid> 

Кто-нибудь есть опыт работы с Xamarin.Forms и может помочь мне с этой проблемой?

ответ

4

Первое первые: XAML имена чувствительны к регистру, поэтому вместо

BindingContext="{x:Reference Name=button1}" 

это должно быть

BindingContext="{x:Reference Name=Button1}" 

Кроме этого, ваш Xaml был почти нормально. Давайте посмотрим на

Height="{Binding Path=WidthRequest}" 

Вы пытаетесь связать с высоты отображения вида, но HeightProperty является только для чтения BindableProperty, так что вы не можете установить его. Если вы посмотрите на API, для свойства Height нет общедоступного устройства. Таким образом, вместо привязки к высоте, вы должны привязываться к HeightRequest.

HeightRequest="{Binding Path=WidthRequest}" 

Это способ сказать, что вы хотели бы, чтобы Grid, чтобы быть такой высоты, и система компоновки будет делать все возможное, чтобы сделать вас счастливым (но это лучшее усилие только).

Я думаю, вы это до сих пор. Кнопка WidthRequest - это запрос, сделанный пользователем, и в этом случае он не установлен, и его значение остается по умолчанию. Вместо этого вы хотите использовать фактическое значение Height кнопки в качестве источника вашего привязки. Давайте сделаем это:

HeightRequest="{Binding Width}" 

и это дает ожидаемый результат:

actual result

Вот полный исправлен Xaml фрагмент кода:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Grid x:Name="TopGrid" Grid.Row="0" BindingContext="{x:Reference Name=Button1}" HeightRequest="{Binding Width}"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Button x:Name="Button1" Grid.Column="0" Text="1" BackgroundColor="Pink"/> 
    <Button x:Name="Button2" Grid.Column="1" Text="2" BackgroundColor="Pink"/> 
    <Button x:Name="Button3" Grid.Column="2" Text="3" BackgroundColor="Pink"/> 
    <Button x:Name="Button4" Grid.Column="3" Text="4" BackgroundColor="Pink"/> 
    </Grid> 
</Grid>