在html中可以说width =“20%”。当然,XAML中不允许这样做。有谁知道为什么在XAML中有或没有办法获得百分比值支持?
答案 0 :(得分:54)
Grid ColumnDefinitions和RowDefinitions允许比例单位(除了固定像素和Auto)。
以下是两个例子:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="20" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
第一列将尽可能大,以适合列中的所有内容。下一列是20个与设备无关的像素宽。网格的剩余宽度将在其余列中平均分配。 (100%/ 4 =每个25%)
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
此代码将4列分为总网格宽度的10%,40%,40%和10%。
答案 1 :(得分:0)
最好采用编程方式解决该问题。
为元素分配一半屏幕尺寸的示例:
var deviceScreenHeight = DeviceDisplay.MainDisplayInfo.Height;
view.HeightRequest = deviceScreenHight * .5;
限制是它不能直接通过绑定到XAML来应用,但是可以轻松解决相关的问题,并且可以分配给任何视图维度(当然)。始终了解事物的复杂应用是基于这样的简单计算,因此很容易应用。可以将其应用于继承类,该继承类根据任何百分比计算来使高度或宽度超载。
答案 2 :(得分:0)
如果您不使用网格,那么您可以使用 Xamarin.Essentials 获取以像素为单位的实际宽度/高度,然后除以密度并乘以所需的尺寸
即
Convert.ToInt32(Math.Round(DeviceDisplay.MainDisplayInfo.Width / DeviceDisplay.MainDisplayInfo.Density * 0.9))
以像素/密度为单位的实际屏幕宽度 * 所需的百分比
我的示例是屏幕宽度的 90%,您可以在来自 Xaml 的 VM 中绑定到此计算
XML
<StackLayout WidthRequest="{Binding PickerWidth}" BackgroundColor="AliceBlue">
<Label Text="Test" HorizontalOptions="FillAndExpand"/>
</StackLayout>
虚拟机
private int _pickerWidth;
public int PickerWidth
{
get => _pickerWidth;
set => SetProperty(ref _pickerWidth, value);
}
public void Init()
{
PickerWidth = Convert.ToInt32(Math.Round(DeviceDisplay.MainDisplayInfo.Width / DeviceDisplay.MainDisplayInfo.Density * 0.9))
}
我刚刚开始将它用于使用 XF 4.8 在 iOS 和 Android 上运行的应用程序,它可以正常工作以将弹出页面的大小调整为可用屏幕宽度的 90%
在平板电脑和手机上测试