1 Вопрос: Как сохранить соотношение сторон элемента управления Xamarin Forms в StackLayout

вопрос создан в Wed, May 8, 2019 12:00 AM

У меня есть Представление SkiaSharp, встроенное в приложение Xamarin.Forms . Вид SkiaSharp должен быть нарисован с определенным соотношением сторон. Ширина представления зависит от его родителя (и размера телефона /идиомы), поэтому ширина не всегда известна при первом создании представления, поэтому я не могу установить HeightRequest при первом построении представления.

Я не могу использовать RelativeLayout , потому что мне нужно иметь представление SkiaSharp в StackLayout с большим количеством элементов управления, расположенных под видом. Кроме того, я ищу более общее решение, в котором я могу разместить представление SkiaSharp в любом объекте макета, например в сетке.

Можно ли мне указать соотношение сторон для представления SkiaSharp и автоматически настроить его высоту на основе требуемого соотношения сторон и его ширины?

    
1
1 ответ                              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, но приведенный выше код работал для меня.

    
1
2019-05-08 15: 51: 27Z
источник размещен Вот