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

更改Xamarin中格式化文本的字体,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我有一个带格式文本的标签,我想改变它的字体样式(我的意思是字体)。 我尝试使用自定义标签渲染(比如对普通文本进行渲染),但没有得到反映。 我的疑问是我们是否可以改变格式化文本的字体(因为它对标签的文本(非格式化文本)工作正常) 这是我的.xaml文件代码 <Label x:Name = "invosTitle" Grid.Column = "0" Grid.Row = "0" Grid.ColumnSpan = "3" HorizontalOptions = "CenterAndExpa

我有一个带格式文本的标签,我想改变它的字体样式(我的意思是字体)。 我尝试使用自定义标签渲染(比如对普通文本进行渲染),但没有得到反映。 我的疑问是我们是否可以改变格式化文本的字体(因为它对标签的文本(非格式化文本)工作正常)

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

使用FormattedString元素时,可以使用
FontFamily
属性分别更改每个
Span
的字体。您不需要自定义标签渲染器来实现这一点

<Span Text="abcd"  
      ForegroundColor="White" 
      FontFamily="Helvetica" />


文档中记录了这一点。

以防任何人需要保持相同的字体,只需更改跨距颜色以下是代码:

[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;
                }
            }
        }
    }
}
}
[程序集:ExportRenderer(typeof(Label)、typeof(LabelCustomRenderer))]
名称空间YourNamespace
{
公共类LabelCustomRenderer:LabelRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
碱基。一个元素改变(e);
Init();
}
受保护的覆盖无效OneElementPropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
if(e.PropertyName==Label.FontFamilyProperty.PropertyName){
Init();
}
}
void Init(){
if(控件!=null){
var label=(CustomLabel)元素;
如果(label.FontName!=null){
如果(label.FormattedText!=null){
SpannableStringBuilder ssb=新的SpannableStringBuilder();
foreach(label.FormattedText.Span中的Span){
ssb.Append(span.Text);
ForegroundColorSpan ForegroundColorSpan=新的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.TextSize=(float)label.FontSize;
Control.SetText(ssb,TextView.BufferType.Normal);
}否则{
Typeface font=Typeface.CreateFromAsset(Forms.Context.Assets,“Fonts/”+label.FontFamily);
控件。字体=字体;
Control.TextSize=(float)label.FontSize;
}
}
}
}
}
}

请正确格式化您的帖子。您没有显示.xaml文件或CustomLabelRender代码。看到我的答案可能会有帮助谢谢你..Daniel.我知道这一点。但是出于某些原因,我不应该将Xamarin.forms包更新到1.3(我使用的是1.2)。所以我问我是否可以使用CustomLabelRendering和字体来实现这一点。:-)你能告诉我指定字体系列是否也适用于Android吗
[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;
                }
            }
        }
    }
}
}