簡體   English   中英

Xamarin 表單中標簽的間距

[英]Spacing for Label in Xamarin Forms

我正在學習 Xamarin Forms 使用 XAML 創建應用程序的界面。

有沒有辦法在 Xamarin Forms 中設置文本之間的間距?

我試圖在 xamarin 網站上搜索它,但它只顯示了使用 c# 的解決方案。

您可以創建一個將字符串作為值的轉換器,並在 Convert() 方法中的字母之間添加空格。

您必須在每個平台上制作自定義渲染器以向標簽添加字距調整。

表單控制:

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();
            }
        }
    }

此外,僅在 Lollipop 及以上設備上的 Android 中添加了 LetterSpacing 屬性。

只需使用LabelLineHeight屬性將行高設置為字符大小的乘數(如您從 Word 或其他人所知)。 所以它在XAML 中應該是這樣的

<Label Text="Long text spanning at least 2 lines...", LineHeight = "1.5" />

C# 中像這樣

Label label = new Label { Text = "Long text spanning at least 2 lines...", LineHeight = 1.5 };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM