Xamarin Forms 从 GridLength Star 或 Auto 获取绝对值

Xamarin Forms get absolute value from GridLength Star or Auto

我想使用 Grid 布局类型在 phone 屏幕的下角定义一个小方块。

我正在尝试通过在代码隐藏的 OnAppearing 方法中获取列宽,并使用它来设置行高。

在 Xaml 我做到了:

<Grid x:Name         ="iconGrid"
      BackgroundColor="Green">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="9*" />
        <ColumnDefinition Width="1.9*" />
        <ColumnDefinition Width="0.1*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="5*" />
        <RowDefinition Height="4.9*" />
        <RowDefinition Height="0.1*" />
    </Grid.RowDefinitions>
    <Frame BackgroundColor="Purple"
           Grid.Row       ="1"
           Grid.Column    ="1" />
</Grid>

然后在 OnAppearing 中我做了这个:

    protected override async void OnAppearing()
    {
        base.OnAppearing();

        iconGrid.RowDefinitions[1].Height = new GridLength(iconGrid.ColumnDefinitions[1].Width.Value);
        iconGrid.RowDefinitions[2].Height = new GridLength(iconGrid.ColumnDefinitions[2].Width.Value);
        var remainingHeight = iconGrid.Height - iconGrid.RowDefinitions[2].Height.Value - iconGrid.RowDefinitions[2].Height.Value;
        iconGrid.RowDefinitions[0].Height = new GridLength(remainingHeight);

        Debug.WriteLine("rows: " + iconGrid.RowDefinitions[0].Height + ", " + iconGrid.RowDefinitions[1].Height + ", " + iconGrid.RowDefinitions[2].Height);
    }

我的调试输出是:

rows: 811.8.Absolute, 1.9.Absolute, 0.1.Absolute

因此,从调试输出看来,我只是获取了列宽的 star 值,并将它们按字面意思用作 absolute 行的值,这当然不起作用。

我想要的是获取列的屏幕绝对值,并将它们用作行的绝对值。

所以简而言之,我需要获得被定义为星型的列在屏幕上的实际点大小。这可能吗?看来一定是。

以为我迷失了你的所有需求,也迷失了自己..对不起,关于那个。

从显示中获取绝对值很好..很复杂,但是有一个新的 Nuget 包正在开发中,它仍处于预发布阶段,称为 Xamarin.Essentials,它可以让您获得宽度和phone 的高度,根据您的设计,应该很容易计算出您需要的尺寸。

要安装 Nuget 包 Xamarin.Essential,首先勾选复选框:包括预发布版。

添加到代码隐藏:

using Xamarin.Essentials;

你可以获取方向、旋转、密度、宽度和高度,最后一个不随旋转而改变——如果Genymotions Android模拟器可以相信的话。

var metrics = DeviceDisplay.ScreenMetrics;
// Orientation (Landscape, Portrait, Square, Unknown)
var orientation = metrics.Orientation;
// Rotation (0, 90, 180, 270)
var rotation = metrics.Rotation;
// Width (in pixels)
var width = metrics.Width;
// Height (in pixels)
var height = metrics.Height;
// Screen density
var density = metrics.Density;

据我所知,它为您提供了页面的可用高度,即减去顶部任何菜单的高度。

这里有更多信息:https://docs.microsoft.com/en-us/xamarin/essentials/?context=xamarin/xamarin-forms

--- 原版 Post "Relative Layout" ---

<RowDefinition 
RelativeLayout.HeightConstraint="{ConstraintExpression 
Type=RelativeToParent,
Property=Height,
Factor=0.1,
Constant=0}" />

<ColumnDefinition 
RelativeLayout.WidthConstraint="{ConstraintExpression 
Type=RelativeToParent, 
Property=Heigth, 
Factor=0.1,
Constant=0}"