更改Xamarin中格式化文本的字体



我有一个带有格式化文本的标签,我想更改它的字体样式(我指的是字体)。我尝试使用自定义标签渲染(就像对普通文本进行自定义标签渲染一样),但没有得到反映。我怀疑我们是否可以更改格式化文本的字体(因为它对标签的文本(而不是格式化文本)很好)。

这是我的.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;
                }
            }
        }
    }
}
}

最新更新