Как заставить Xamarin.Forms изменить размер моего пользовательского элемента управления на Android

Мой пользовательский элемент управления иногда может изменить его размер. В этом случае я звоню RequestLayout а также Invalidate, Затем в OnMeasure Я звоню SetMeasuredDimension с новой высотой. Но здесь я сталкиваюсь с двумя проблемами:

  1. OnMeasure называется с MeasureSpecMode.Exact,
  2. Даже если я игнорирую MeasureSpecMode и позвонить SetMeasuredDimension с новыми значениями размер элемента управления остается прежним.

Итак, мой вопрос: есть ли способ сообщить движку форм Forms обновить размер моих элементов управления?

РЕДАКТИРОВАТЬ: Можно заставить Forms обновить макет, скрыв и затем показывая элемент управления, но я ищу менее хакерский способ исправить это.

1 ответ

Если мы действительно говорим о формах, а не о xamarin.android, вы можете проверить, как это работает, здесь: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/custom

Итак, в основном внутри вашего элемента управления Forms после того, как вы рассчитали желаемый размер, вызовите InvalidateMeasure(); Переопределить OnMeasure и передайте желаемый размер, все остальное Forms сделает:

      //fields used to store the desired size
private double _widthRequest = -1;
private double _heightRequest = -1;

    protected override SizeRequest OnMeasure(double widthConstraint, double heightConstraint)
    {
        if (_widthRequest > 0 && _heightRequest > 0)
        {
            var wish = new Size(_widthRequest, _heightRequest);
            _widthRequest = -1;
            _heightRequest = -1;
            return new SizeRequest(wish);
        }

        return base.OnMeasure(widthConstraint, heightConstraint);
    }
Другие вопросы по тегам