1

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

[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)什么是正确的方式?

4

1 回答 1

2

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

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

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

在共享/便携式项目中:

public class MyLabel : Label {}

在安卓项目中:

[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" };
于 2016-08-05T05:31:26.903 回答