1 Câu hỏi: Làm cách nào tôi có thể duy trì tỷ lệ khung hình của điều khiển Xamarin Forms trong StackLayout

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi có Chế độ xem SkiaSharp được nhúng trong ứng dụng Xamarin.Forms . Khung nhìn SkiaSharp cần được vẽ ở một tỷ lệ khung hình cụ thể. Độ rộng của chế độ xem tùy thuộc vào cha mẹ của nó (và kích thước /thành ngữ điện thoại), do đó, chiều rộng không phải lúc nào cũng được biết khi chế độ xem được tạo lần đầu tiên, do đó tôi không thể đặt heightRequest khi chế độ xem được xây dựng lần đầu tiên.

Tôi không thể sử dụng RelativeLayout vì tôi cần có chế độ xem SkiaSharp trong StackLayout với nhiều điều khiển hơn nằm dưới chế độ xem. Ngoài ra, tôi đang tìm kiếm một giải pháp tổng quát hơn, nơi tôi có thể đặt chế độ xem SkiaSharp trong bất kỳ đối tượng bố cục nào như lưới.

Có cách nào để tôi chỉ định tỷ lệ khung hình cho chế độ xem SkiaSharp và để nó tự động điều chỉnh kích thước chiều cao của nó dựa trên tỷ lệ khung hình mong muốn và chiều rộng của nó không?

    
1
1 Câu trả lời                              1                         

Vì chiều rộng của chế độ xem không thể được xác định khi được tạo lần đầu tiên, mã phải phản ứng với thay đổi độ rộng và đặt Chiều cao tương đương tại thời điểm đó.


// 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();
       }
   }
}

Tôi không chắc chắn nếu InvalidateMeasure là cần thiết, nhưng mã ở trên hoạt động với tôi.

    
1
2019-05-08 15: 51: 27Z
nguồn đặt đây