如何仅将自定义渲染器添加到某些特定布局?

How to add custom renderers to only some specific Layouts?

比方说,我想更改标签的字体。这意味着我将不得不写这样的东西:

[assembly: ExportRenderer(typeof(Label), typeof(LabelFontRenderer))]
namespace MyApp.Droid
{
    public class LabelFontRenderer : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);
            var label = (TextView)Control; // for example
            Typeface font = Typeface.CreateFromAsset(Forms.Context.Assets, "Roboto-Regular.ttf");  // font name specified here
            label.Typeface = font;
        }
    }
}

但是,将其添加到项目将使所有标签以指定字体呈现。如果我只想使用该字体渲染一些特定标签怎么办?

也许一个解决方案是从 Label 继承并将渲染器添加到继承的 class,从而仅将其应用于特定 class 的实例,因此仅将其应用于指定的标签。因此,我的问题由两部分组成:(1) 是我描述的正确方法吗?如果不是,(2) 什么是正确的方法?

Maybe a solution is to inherit from Label and add renderer to that inherited class, thus applying it only to the instances of that particular class and therefore applying it only to specified labels.

这是为您的 controls/needs 执行自定义渲染器的正确方法。通过导出 Label 类型的渲染器,您将修改应用程序中的所有标签。

您必须在共享项目中创建继承的 Label class 并为其定义自定义渲染器。例如:

在shared/portable项目中:

public class MyLabel : Label {}

在 Android 项目中:

[assembly: ExportRenderer(typeof(MyLabel), typeof(LabelFontRenderer))] 
namespace MyApp.Droid
{
    public class LabelFontRenderer : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);
            var label = (TextView)Control; // for example
            Typeface font = Typeface.CreateFromAsset(Forms.Context.Assets, "Roboto-Regular.ttf");  // font name specified here
            label.Typeface = font;
        }
    }
}

用法:

var myLabel = new MyLabel { Text = "Hello" };