我有一个带有格式化文本的标签,我想更改它的字体样式(我指的是字体)。我尝试使用自定义标签渲染(就像对普通文本进行自定义标签渲染一样),但没有得到反映。我怀疑我们是否可以更改格式化文本的字体(因为它对标签的文本(而不是格式化文本)很好)。
这是我的.xaml文件代码
<Label x:Name = "invosTitle" Grid.Column = "0" Grid.Row = "0" Grid.ColumnSpan = "3" HorizontalOptions = "CenterAndExpand">
<Label.FormattedText>
<FormattedString>
<FormattedString.Spans>
<Span Text = "abcd" ForegroundColor = "White" ></Span>
<Span Text = " "></Span>
<Span Text = "efgh" ForegroundColor = "Gray"></Span>
</FormattedString.Spans>
</FormattedString>
</Label.FormattedText>
</Label>
CustomLabelRenderer代码为
protected override void OnElementPropertyChanged (object sender , PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
var label = (TextView)Control;
Typeface font = Typeface.CreateFromAsset (Forms.Context.Assets, "Fonts/microsoftjhengheibold.otf");
label.Typeface = font;
label.SetTypeface (font, TypefaceStyle.Bold);
}
使用FormattedString元素时,可以使用FontFamily
属性单独更改每个Span
的字体。您不需要自定义标签渲染器来实现这一点。
<Span Text="abcd"
ForegroundColor="White"
FontFamily="Helvetica" />
这在Xamarin的"使用字体"文档中有记载。
为了防止任何人需要保持相同的字体并更改跨度颜色,下面是代码:
[assembly: ExportRenderer (typeof (Label), typeof (LabelCustomRenderer))]
namespace YourNamespace
{
public class LabelCustomRenderer : LabelRenderer
{
protected override void OnElementChanged (ElementChangedEventArgs<Label> e)
{
base.OnElementChanged (e);
Init ();
}
protected override void OnElementPropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged (sender, e);
if (e.PropertyName == Label.FontFamilyProperty.PropertyName) {
Init ();
}
}
void Init(){
if (Control != null) {
var label = (CustomLabel)Element;
if (label.FontName != null) {
if (label.FormattedText != null) {
SpannableStringBuilder ssb = new SpannableStringBuilder ();
foreach (Span span in label.FormattedText.Spans) {
ssb.Append (span.Text);
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan (span.ForegroundColor.ToAndroid ());
ssb.SetSpan (foregroundColorSpan, ssb.Length () - span.Text.Length, ssb.Length (), SpanTypes.ExclusiveExclusive);
}
Typeface font = Typeface.CreateFromAsset (Forms.Context.Assets, "Fonts/" + label.FontFamily);
Control.Typeface = font;
Control.TextSize = (float)label.FontSize;
Control.SetText (ssb, TextView.BufferType.Normal);
} else {
Typeface font = Typeface.CreateFromAsset (Forms.Context.Assets, "Fonts/" + label.FontFamily);
Control.Typeface = font;
Control.TextSize = (float)label.FontSize;
}
}
}
}
}
}