【问题标题】:Force a view to be square in shape强制视图为方形
【发布时间】:2016-08-28 00:51:47
【问题描述】:

我正在尝试在 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 绑定到它的实际宽度,但我不知道这是否可能,或者如果可以的话该怎么做。如果没有,还有其他选择吗?

【问题讨论】:

    标签: xaml user-interface xamarin.forms


    【解决方案1】:

    由于您将框架的 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;
            }
        };
    

    【讨论】:

    • 你不应该在 else 中设置 HeightRequest 吗?
    • 我刚刚遇到了一个应该容纳图像的框架的问题。最后,让图像看起来像我用框架制作的部分要容易得多,因为图像的纵横比保持比保持框架方形要容易得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2014-06-17
    • 2018-07-28
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多