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

时间:2016-08-05 05:04:34

标签: android xamarin label xamarin.forms custom-renderer

让我们说,我想改变标签的字体。这意味着我必须写出类似的东西:

[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继承并将渲染器添加到该继承的类,因此仅将其应用于该特定类的实例,因此仅将其应用于指定的标签。因此,我的问题包括两个部分:(1)是我描述正确方式的方式,是否有效,如果没有,(2)正确的方法是什么?

1 个答案:

答案 0 :(得分:2)

  

也许解决方案是从Label继承并将渲染器添加到该继承的类,因此仅将其应用于该特定类的实例,因此仅将其应用于指定的标签。

这是为 控件/需求执行自定义渲染器的正确方法。通过导出Label类型的渲染器,您可以修改应用中的所有标签。

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

在共享/便携式项目中:

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" };