Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xaml 强制视图为方形_Xaml_User Interface_Xamarin.forms - Fatal编程技术网

Xaml 强制视图为方形

Xaml 强制视图为方形,xaml,user-interface,xamarin.forms,Xaml,User Interface,Xamarin.forms,我正在尝试用XAML为Xamarin表单创建一个UI,其中我在网格中有一个框架(尽管我假设对于任何类型的视图,答案都是相同的)。我希望框架在它所占据的网格单元中使用其可用的全宽度,但我希望强制它为方形。因此,我希望宽度自动调整大小,并将高度设置为与其实际宽度匹配 以下是我目前掌握的情况: <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefin

我正在尝试用XAML为Xamarin表单创建一个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个按钮的总高度大致相同


我在想,我可能需要将框架的高度请求绑定到其实际宽度,但我不知道这是否可行,或者如果可行的话如何实现。如果没有,还有其他选项吗?

因为要将帧的行跨度设置为3,即使将帧的HeightRequest显式设置为某个较小的值,帧仍将占据整个网格的高度。所以首先你必须防止这种情况发生。可以通过将框架包含在其他视图中来实现这一点

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

还请注意,默认情况下,“帧”的填充为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>

你不应该在else中设置HeightRequest吗?我刚刚遇到了一个本来应该保存图像的框架的问题。最后,仅仅使图像看起来像我用一帧制作的部分要容易得多,因为图像的纵横比比比保持一帧正方形要容易得多。
    InitializeComponent();

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

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