自定义渲染器在资源字典内的数据模板内使用时是否不起作用?
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);
我正在尝试制作一个聊天页面,其中消息从左侧 (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);