如何在StackLayout中维护Xamarin Forms控件的长宽比

时间:2019-05-08 15:44:23

标签: c# user-interface layout xamarin.forms

我有一个SkiaSharp view which is embedded in a Xamarin.Forms应用。需要以特定的纵横比绘制SkiaSharp视图。视图的宽度取决于其父视图(以及手机的大小/习惯用语),因此,在第一次创建视图时并不总是知道该宽度,因此,在第一次构建视图时,我无法设置HeightRequest

我不能使用RelativeLayout,因为我需要在StackLayout中拥有SkiaSharp视图,并且在该视图下还有更多控件。另外,我正在寻找一种更通用的解决方案,可以将SkiaSharp视图放置在任何布局对象(例如网格)中。

我是否可以为SkiaSharp视图指定长宽比,并根据所需的长宽比和宽度自动调整其高度?

1 个答案:

答案 0 :(得分:1)

由于视图的宽度在首次创建时无法确定,因此代码必须对宽度的更改做出反应,并在那时设置HeightRequest。


// If you want to dynamically adjust the aspect ratio after creation
// this property should have logic in its setter to adjust the height request
public float DesiredAspectRatio { get; set; }

public MyControl()
{
   // Subscribe to the SizeChanged event in the constructor
   SizeChanged += HandleSizeChanged;
}

private void HandleSizeChanged(object sender, EventArgs e)
{
   if (this.Width > 0 && desiredAspectRatio > 0)
   {
       var desiredHeightRequest = this.Width / DesiredAspectRatio;
       // int it to make sure there's no weird recursive behavior
       // caused in release by how floats/doubles are handled.
       if((int)desiredHeightRequest != (int)HeightRequest)
       {
           this.HeightRequest = (int)desiredHeightRequest;
           InvalidateMeasure();
       }
   }
}

我不确定InvalidateMeasure是否必要,但是上面的代码对我有用。