让我们说,我想改变标签的字体。这意味着我必须写出类似的东西:
[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)正确的方法是什么?
答案 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" };