RUDE

Пользовательский рендерер не работает, когда он используется внутри шаблона данных в словаре ресурсов?

Я пытаюсь создать страницу чата, где сообщения располагаются с левой стороны (конверсия) или с правой стороны (пользователь). Итак, я буду использовать селектор шаблонов данных и представление списка/коллекции для хранения сообщений. Все работает нормально, если я использую представление «Ярлык» по умолчанию, но если я изменю его на свой собственный рендерер «Ярлык», он больше не работает.

Вот мой код для пользовательского средства визуализации «Ярлык».

CustomLabel.cs в общей папке

public class CustomLabel : Label
{
    public static readonly BindableProperty MaxWidthProperty = BindableProperty.Create(nameof(MaxWidth), typeof(int), typeof(CustomLabel));
    public int MaxWidth
    {
        get { return (int)GetValue(MaxWidthProperty); }
        set { SetValue(MaxWidthProperty, value); }
    }
}

CustomLabelRenderer.cs в Android

public class CustomLabelRenderer : LabelRenderer
{
    public CustomLabelRenderer(Context context) : base(context)
    {
        AutoPackage = false;
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);

        if(Context != null)
        {
            var view = ((CustomLabel)Element);
            Control.SetMaxWidth(view.MaxWidth);
        }
    }
}

Вот мой код для селектора шаблона данных в словаре ресурсов и изображения результата. Для использования пользовательской метки я просто заменил «Label» на «local: CustomLabel».

Использование ярлыка

<ResourceDictionary>
        <DataTemplate x:Key="leftSideTemplate" x:DataType="model:Message">
            <ViewCell>
                <Label Text="{Binding Text}"
                        HorizontalTextAlignment="Start"
                        HorizontalOptions="StartAndExpand" 
                        BackgroundColor="{StaticResource BgColorSecondaryUser}"/>
            </ViewCell>
        </DataTemplate>
        <DataTemplate x:Key="rightSideTemplate" x:DataType="model:Message">
            <ViewCell>
                <Label Text="{Binding Text}"
                        HorizontalTextAlignment="End"
                        HorizontalOptions="EndAndExpand" 
                        BackgroundColor="{StaticResource BgColorPrimaryUser}"/>
            </ViewCell>
        </DataTemplate>
        <dt:ConversationTemplateSelector x:Key="conversationPageTemplateSelector"
            LeftSideTemplate="{StaticResource leftSideTemplate}" RightSideTemplate="{StaticResource rightSideTemplate}"/>
    </ResourceDictionary>

Использование представления «Ярлык» по умолчанию

Использование моего пользовательского рендерера «Label»


1
20
1

Ответ:

Решено

Только SetMaxWidth, когда свойство MaxWidth представления больше 0. В противном случае элемент управления может иметь нулевую ширину, поэтому ничего не видно:

    if (view.MaxWidth > 0)
        Control.SetMaxWidth(view.MaxWidth);