【发布时间】:2016-06-25 22:59:07
【问题描述】:
我不明白为什么这么难。 relativelayout上没有anchor吗?
我想把正方形放在屏幕的中心。 正方形的宽度是屏幕宽度的 80%。 正方形的高度与宽度相同。
这么简单。
但到目前为止无法弄清楚使用 xaml。 你能帮帮我吗?
【问题讨论】:
标签: xaml xamarin xamarin.forms
我不明白为什么这么难。 relativelayout上没有anchor吗?
我想把正方形放在屏幕的中心。 正方形的宽度是屏幕宽度的 80%。 正方形的高度与宽度相同。
这么简单。
但到目前为止无法弄清楚使用 xaml。 你能帮帮我吗?
【问题讨论】:
标签: xaml xamarin xamarin.forms
最简单的 XAML 解决方案是(受@Funk 启发):
更新:正如 cmets 中所说,这现在适用于 Android 和 iOS(已修复 Xamarin.Android 错误)
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="8*" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<BoxView x:Name="thebox" Grid.Column="1" Grid.Row="1" BackgroundColor="Aqua" HeightRequest="{Binding Source={x:Reference thebox}, Path=Width}" />
</Grid>
结果:
困难重重(适用于 Android 和 iOS):
假设您想使用BoxView,我为您的案例制作了一个临时解决方案。
我扩展了BoxView 并强制wight 与width 相同。您可以使用它来获得其他结果。
XAML 将如下所示:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="forms_pcl.MyPage" xmlns:local="clr-namespace:forms_pcl;assembly=forms_pcl">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="8*" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="8*" />
<RowDefinition />
</Grid.RowDefinitions>
<local:SquareBox HorizontalOptions="CenterAndExpand" VerticalOptions="Center" BackgroundColor="Aqua" Grid.Column="1" Grid.Row="1" />
</Grid>
</ContentPage>
注意:标志 HorizontalOptions="CenterAndExpand" VerticalOptions="Center" 是强制调用 GetSizeRequest 的高度和宽度。
SquareBox 看起来像:
public class SquareBox : BoxView
{
public override SizeRequest GetSizeRequest(double widthConstraint, double heightConstraint)
{
return new SizeRequest(new Size(widthConstraint, widthConstraint), new Size(widthConstraint, widthConstraint));
}
}
结果:
【讨论】:
我不了解 Xamarin,但在 Xaml 中,您可以使用 squares ActualWidth 属性将比例宽度“转换”为与设备无关的像素。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="8*"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Name="square"
BorderBrush="Red" BorderThickness="1" Grid.Column="1" Grid.Row="1"
Height="{Binding ElementName=square, Path=ActualWidth}"
/>
</Grid>
编辑
尝试使用Xamarin Binding Basics 转换语法。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="8*"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<BoxView x:Name="square"
BindingContext="{x:Reference square}"
Grid.Column="1" Grid.Row="1" BackgroundColor="Red"
Height="{Binding ActualWidth}"
/>
</Grid>
【讨论】:
由于性能问题,不建议使用 relativeLayout。 对于您的问题,我建议使用像下面这样的 Grid
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="8*"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="8*"/>
<RowDefinition/>
</Grid.RowDefinitions>
<BoxView BackgroundColor="Red" Grid.Column="1" Grid.Row="1"/>
</Grid>
【讨论】: