Как правильно создать пользовательский рендерер для StackLayout в Xamarin.Forms? - PullRequest
2 голосов
/ 04 марта 2020

Я пытаюсь создать пользовательский рендерер StackLayout, и согласно документации базовый рендерер является ViewRenderer.

Итак, я закончил с этим для iOS:

public class MyCustomStackLayout : StackLayout { }

public class MyCustomStackLayoutRenderer : ViewRenderer<MyCustomStackLayout, UIView> 
{   
        protected override void OnElementChanged(ElementChangedEventArgs<ExportableStackLayout> e)
        {
            base.OnElementChanged(e);

            // some customizations here that don't mess with BackgroundColor at all
            // removing all customizations doesn't fix the issue either.
        }
}

И я использую это так в своем XAML:

<custom:MyCustomStackLayout BackgroundColor="Green">
</custom:MyCustomStackLayout>

Почти все Работая нормально, средство визуализации зарегистрировано правильно и ведет себя как StackLayout, даже позволяя изменить Orientation, но по какой-то причине значение BackgroundColor, установленное в моем MyCustomStackLayout, игнорируется, поэтому оно всегда прозрачно.

Я не смог найти точно, где в кодовой базе зарегистрирован рендерер для оригинального StackLayout, так как он не зарегистрирован в AssemblyInfo с другими рендерами, поэтому я не уверен на 100%, что я здесь поступаю правильно.

Есть ли что-то, чего мне не хватает, что заставляет BackgroundColor игнорироваться? Я использую правильный Renderer для StackLayout? Кто-нибудь знает, где именно он регистрируется?

Обновление: я знаю, как реализовать BackgroundColor, мне действительно интересно понять, почему он не в первую очередь работает. Поскольку я использую тот же рендерер из оригинального StackLayout, который уже реализует этот .

1 Ответ

0 голосов
/ 04 марта 2020

Кажется, проблема дизайна ViewRenderer. Вы можете добавить следующий код в рендерере.

protected override void SetBackgroundColor(Color color)
{
    base.SetBackgroundColor(color);

    if (NativeView == null)
        return;

    if (color != Color.Default)
        NativeView.BackgroundColor = color.ToUIColor();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...