强制视图呈方形

时间:2016-05-03 05:30:53

标签: xaml user-interface xamarin.forms

我正在尝试在XAML中为Xamarin Forms创建一个UI,其中我有一个框架(虽然我假设答案对于任何类型的视图都是相同的)在网格内部。我希望框架在它占据的网格单元格中使用可用的全宽度,但我想强制它为方形。因此,我希望宽度自动调整大小,并将高度设置为与其实际宽度相匹配。

这是我到目前为止所拥有的:

  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="*"/>
      <RowDefinition Height="*"/>
      <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="2*"/>
      <ColumnDefinition Width="6*"/>
      <ColumnDefinition Width="*"/>
      <ColumnDefinition Width="13*"/>
      <ColumnDefinition Width="2*"/>
    </Grid.ColumnDefinitions>

    <Button Grid.Row="0" Grid.Column="1"/>
    <Button Grid.Row="1" Grid.Column="1"/>
    <Button Grid.Row="2" Grid.Column="1"/>
    <Frame Grid.Row="0" Grid.Column="3" Grid.RowSpan="3" OutlineColor="Silver" HorizontalOptions="Fill">
      <Image />
    </Frame>
  </Grid>

目前,框架正确填充了可用的宽度,但高度与其左侧3个按钮的总高度大致相同。

我在想,我可能需要将框架的HeightRequest绑定到它的实际宽度,但我不知道这是否可能,或者如果它是如何做到的。如果没有,还有其他选择吗?

1 个答案:

答案 0 :(得分:2)

由于您将帧的RowSpan设置为3,即使您将帧的HeightRequest明确设置为某个较小的值,该帧仍将占用整个网格的高度。所以首先你必须防止这种情况发生。你可以通过在其他视图中包含框架来做到这一点。

现在,为了使框架的高度和宽度与缩放相同,您可以使用容器的SizeChanged事件并相应地设置框架的高度和宽度请求。

另请注意,默认情况下,Frame的填充为20。

这是xaml的示例代码:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="6*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="13*"/>
            <ColumnDefinition Width="2*"/>
        </Grid.ColumnDefinitions>

        <Button Grid.Row="0" Grid.Column="1"/>
        <Button Grid.Row="1" Grid.Column="1"/>
        <Button Grid.Row="2" Grid.Column="1"/>

        <StackLayout x:Name="frmContainer" Grid.Row="0" Grid.Column="3" Grid.RowSpan="3" BackgroundColor="Orange">
            <Frame x:Name="frm" OutlineColor="Silver" VerticalOptions="Center" HorizontalOptions="Center" Padding="0" BackgroundColor="Green"/>
        </StackLayout>
    </Grid>

这是代码隐藏中的构造函数:

    InitializeComponent();

    frmContainer.SizeChanged += (s, e) =>
    {
        frm.HeightRequest = frmContainer.Width;

        if (frmContainer.Width > frmContainer.Height)
        {
            frm.WidthRequest = frmContainer.Height;
        }
        else
        {
            frm.WidthRequest = frmContainer.Width;
        }
    };