[英]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 屬性。
只需使用Label的LineHeight屬性將行高設置為字符大小的乘數(如您從 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.