Как сохранить соотношение сторон элемента управления Xamarin Forms в StackLayout - PullRequest
1 голос
/ 08 мая 2019

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

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

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

1 Ответ

1 голос
/ 08 мая 2019

Так как ширина представления не может быть определена при его первом создании, код должен реагировать на изменение ширины и настройку 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 необходимо, но у меня сработал код выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...