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}"
我想使用 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}"