自定义渲染器在资源字典内的数据模板内使用时是否不起作用?

Does a custom renderer not work when it is used inside a data template within the resource dictionary?

我正在尝试制作一个聊天页面,其中消息从左侧 (conversee) 或右侧 (user) 排列。因此,我将使用数据模板选择器和 listview/collection 视图来保存消息。如果我使用默认的“标签”视图,一切正常,但如果我将它更改为我自己的自定义“标签”渲染器,它就不再工作了。

这是我的自定义“标签”渲染器代码。

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>

Using default "Label" view

Using my custom "Label" renderer

仅当视图的 MaxWidth 属性 大于 0 时才设置 MaxWidth。否则,控件的宽度可能为零,因此什么也看不到:

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