有没有一种方法可以在标签中使用 Span 并证明它是合理的? [英] Is there a way that I can use Spans inside of a label and also have it justified?

查看:13
本文介绍了有没有一种方法可以在标签中使用 Span 并证明它是合理的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用此代码为标签内的文本添加一些颜色:

I am using this code to add some colors to my text inside of a label:

<Label.FormattedText>
  <FormattedString>
     <Span Text="I would like the word " />
     <Span Text="HERE" ForegroundColor="Red" FontAttributes="Bold" />
     <Span Text="to be in a bold font" />
   </FormattedString>
</Label.FormattedText>

以前我一直使用此渲染代码来证明标签的合理性:

Previously I had been using this rendering code to justify the label:

public class JustifiedLabelRenderer : LabelRenderer
{
    public JustifiedLabelRenderer() {}

    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);

        //if we have a new forms element, we want to update text with font style (as specified in forms-pcl) on native control
        if (e.NewElement != null)
            UpdateTextOnControl();
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        //if there is change in text or font-style, trigger update to redraw control
        if (e.PropertyName == nameof(Label.Text)
           || e.PropertyName == nameof(Label.FontFamily)
           || e.PropertyName == nameof(Label.FontSize)
           || e.PropertyName == nameof(Label.TextColor)
           || e.PropertyName == nameof(Label.FontAttributes))
        {
            UpdateTextOnControl();
        }
    }

    void UpdateTextOnControl()
    {
        if (Control == null)
            return;

        //define paragraph-style
        var style = new NSMutableParagraphStyle()
        {
            Alignment = UITextAlignment.Justified,
            FirstLineHeadIndent = 0.001f,
        };

        //define attributes that use both paragraph-style, and font-style 
        var uiAttr = new UIStringAttributes()
        {
            ParagraphStyle = style,
            BaselineOffset = 0,

            Font = Control.Font
        };

        //define frame to ensure justify alignment is applied
        Control.Frame = new System.Drawing.RectangleF(0, 0, (float)Element.Width, (float)Element.Height);

        //set new text with ui-style-attributes to native control (UILabel)
        var stringToJustify = Control.Text ?? string.Empty;
        var attributedString = new Foundation.NSAttributedString(stringToJustify, uiAttr.Dictionary);
        Control.AttributedText = attributedString;
        Control.Lines = 0;
    }

当我尝试使用此代码设置彩色对齐标签时,对跨度字体和颜色的更改不再显示.

When I try using this code to have a colored justified label the changes to the span font and color don't show up any more.

有没有办法让我的标签既合理又内部有颜色跨度?

Is there a way that I could have a label that is both justified and also has color spans inside of it?

这是我使用的标签的 XAML 定义:

Here's my XAML definition of the label I am using:

<local:JustifiedLabel x:Name="c0Label" />

这是填充它的代码:

var s = new FormattedString();
s.Spans.Add(new Span { Text = "test words test words test words test words test words test words", ForegroundColor = Color.Red});
s.Spans.Add(new Span { Text = "ABCDEFG", ForegroundColor = Color.Black });
s.Spans.Add(new Span { Text = " test words test words test words test words test words test words test words test words test words test words test words test words ", ForegroundColor = Color.FromHex("555555") });
c0Label.FormattedText = s;

推荐答案

您将不得不更新渲染器以考虑 FormattedText.例如:尝试将渲染器逻辑更改为以下内容:

You will have to update the renderer to consider FormattedText. For e.g.: try changing renderer logic to following:

public class JustifiedLabelRenderer : LabelRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);

        //if we have a new forms element, update text
        if (e.NewElement != null)
            UpdateTextOnControl();
    }

    protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        //if there is change in formatted-text, trigger update to redraw control
        if (e.PropertyName == nameof(Label.FormattedText))
        {
            UpdateTextOnControl();
        }
    }

    void UpdateTextOnControl()
    {
        if (Control == null)
            return;

        //define paragraph-style
        var style = new NSMutableParagraphStyle()
        {
            Alignment = UITextAlignment.Justified,
            FirstLineHeadIndent = 0.001f,

        };

        //define frame to ensure justify alignment is applied
        Control.Frame = new RectangleF(0, 0, (float)Element.Width, (float)Element.Height);
        Control.Lines = 0;

        if (Element.FormattedText.ToAttributed(Element.Font, Element.TextColor) is NSMutableAttributedString attrText)
        {
            var fullRange = new NSRange(0, attrText.Length);
            attrText.AddAttribute(UIStringAttributeKey.ParagraphStyle, style, fullRange);
            Control.AttributedText = attrText;
        }
    }
}

这篇关于有没有一种方法可以在标签中使用 Span 并证明它是合理的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆