强制视图为方形

Joe*_*jr2 5 user-interface xaml 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>
Run Code Online (Sandbox Code Playgroud)

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

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

cha*_*ier 4

由于您将框架的 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>
Run Code Online (Sandbox Code Playgroud)

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

    InitializeComponent();

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

        if (frmContainer.Width > frmContainer.Height)
        {
            frm.WidthRequest = frmContainer.Height;
        }
        else
        {
            frm.WidthRequest = frmContainer.Width;
        }
    };
Run Code Online (Sandbox Code Playgroud)