Xamarin表单中的标签间距

时间:2018-01-23 16:15:40

标签: c# xamarin

我正在使用XAML学习Xamarin表单来为应用程序创建界面。

有没有办法在Xamarin Forms中设置文本之间的间距?

我试图在xamarin网站上搜索它,但它只显示使用c#的解决方案。

2 个答案:

答案 0 :(得分:0)

您可以创建一个转换器,它将字符串作为值并在Convert()方法中的字母之间添加空格。

答案 1 :(得分:0)

您必须在每个平台上制作自定义渲染器,以便为标签添加字距。

表格控制:

public class KerningLabel : Label
{
    public static readonly BindableProperty KerningProperty = BindableProperty.Create(nameof(Kerning), typeof(double), typeof(KerningLabel), 0d);

    public double Kerning
    {
        get { return (double)GetValue(KerningProperty); }
        set { SetValue(KerningProperty, value); }
    }
}

的iOS:

[assembly: ExportRenderer(typeof(KerningLabel), typeof(KerningLabelRenderer))]
namespace YourNamespace
{
    public class KerningLabelRenderer : LabelRenderer
    {
        private NSString _kerningAttribureName = new NSString("NSKern");

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

            if (e.NewElement != null && Control != null)
            {
                SetKerning();
            }
        }

        private void SetKerning()
        {
            var element = Element as KerningLabel;
            string text = Element.Text;
            if (string.IsNullOrEmpty(text))
            {
                Control.Text = string.Empty;
            }
            else
            {
                var attributedString = new NSMutableAttributedString(text);
                attributedString.AddAttribute(_kerningAttribureName, NSObject.FromObject(element.Kerning), new NSRange(0, text.Length - 1));
                Control.AttributedText = attributedString;
            }
        }

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

            if (e.PropertyName == Xaml.KerningLabel.KerningProperty.PropertyName ||
                e.PropertyName == Label.TextProperty.PropertyName ||
                e.PropertyName == Label.TextColorProperty.PropertyName)
            {
                SetKerning();
            }
        }
    }
}

机器人:

[assembly: ExportRenderer(typeof(KerningLabel), typeof(KerningLabelRenderer))]
namespace YourNamespace
{
    public class KerningLabelRenderer : LabelRenderer
    {
        public KerningLabelRenderer()
        {
            AutoPackage = false;
        }

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

            if(e.NewElement != null && Control != null)
            {
                SetKerning();
            }
        }

        private void SetKerning()
        {
            var element = Element as KerningLabel;
            if (element != null && Control != null)
            {
                Control.Text = element.Text;
                if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                {
                    Control.LetterSpacing = (float)((element.Kerning) / 10.0f);
                }
            }
        }

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

            if (e.PropertyName == Xaml.KerningLabel.KerningProperty.PropertyName ||
                e.PropertyName == Xaml.KerningLabel.TextProperty.PropertyName)
            {
                SetKerning();
            }
        }
    }

此外,LetterSpacing属性仅在Android Lollipop设备上添加。