ラベルでテキストを正当化する方法があるかどうかを尋ねたかっただけです。 Xamarin FormsXamlを使用しています。
ありがとう。
PDATE:今のところ、テキストを正当化するはできません。ほとんどの答えはテキストの中央揃えに関するものでしたが、それは私が尋ねたものではありません。 1つの方法は、ティモシーのようにレンダラーを使用することです。
Xamarin.Forms機能を使用してラベルのテキストを全幅に拡大することはできませんが、プラットフォームレンダラーを使用すると簡単に実現できます。
ほとんどのXamarinプラットフォームには、対応するネイティブ要素で使用できるテキスト位置合わせ機能があり、ネイティブ要素の単一の属性を設定するだけです。この機能を標準のXamarin.Formsラベルに追加しない理由は、その機能のプラットフォームが遅れているためだと思います。 AndroidAndroid.Text.JustificationMode.InterWordフラグはバージョン8.1でのみ追加されました
以下に、Androidレンダラーの実装:
using Android.Content;
using Saplin.CPDT.UICore.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[Assembly: ExportRenderer(typeof(Saplin.CPDT.UICore.Controls.ExtendedLabel), typeof(Saplin.CPDT.Droid.ExtnededLabelRenderer))]
namespace Saplin.CPDT.Droid
{
public class ExtnededLabelRenderer : Xamarin.Forms.Platform.Android.LabelRenderer
{
public ExtnededLabelRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
var el = (Element as ExtendedLabel);
if (el != null && el.JustifyText)
{
if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
{
Control.JustificationMode = Android.Text.JustificationMode.InterWord;
}
}
}
}
}
私の例では、Xamarin.Forms.LabelのExtenedLabelサブクラスを追加のプロパティJustifyTextテキストの位置合わせを設定します。これが、サブクラス化されたコントロールを宣言する方法です。
using System;
using Xamarin.Forms;
namespace Saplin.CPDT.UICore.Controls
{
public class ExtendedLabel : Label
{
public static readonly BindableProperty JustifyTextProperty =
BindableProperty.Create(
propertyName: nameof(JustifyText),
returnType: typeof(Boolean),
declaringType: typeof(ExtendedLabel),
defaultValue: false,
defaultBindingMode: BindingMode.OneWay
);
public bool JustifyText
{
get { return (Boolean)GetValue(JustifyTextProperty); }
set { SetValue(JustifyTextProperty, value); }
}
}
}
これを行う現在の方法は、HorizontalTextAlignment
を使用することであり、TextAlignment
列挙の値は次のとおりです。
Center
=中央揃えのテキストStart
=左揃えEnd
=右揃えラベルとそのテキストを中央揃え例:
<Label x:Name="Description" HorizontalTextAlignment="Center" VerticalOptions="Center" HorizontalOptions="Center" />
XAlign
プロパティを使用します
Label lbl = new Label();
lbl.Text = "I'm a Label!";
lbl.XAlign = TextAligntment.Start; // Start, Center, End are valid
テキストを保持するためにどのような種類のコンテナを使用していますか? XAlignとともにFillAndExpandのHorizontalOptionsを使用してStackLayoutを使用すると、それが可能になる場合がありますが、テキストがコントロールごとに1行しかない場合に限ります。
Xamlでは、htmlを使用してテキストを正当化できます。
<Label LineBreakMode="WordWrap" TextType="Html" TextColor="Black">
<Label.Text><p style="text-align:justify;">
Your text here
<p></Label.Text>
これを試して:
<StackLayout HorizontalOptions="FillAndExpand" Padding="0, 10, 0, 10" Spacing="0">
<Label Text="Test message" XAlign="Center"/>
<Label FontSize="Small" Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." LineBreakMode="WordWrap"
XAlign="Center" />
</StackLayout>
相対レイアウトでラベルを使用する場合は、ラベルを正当化できます。
秘訣は、親ごとに幅と高さを入力する必要があることです。
だから私はHeightConstraint、WidthConstraint with factor = 1 ..を使用するので、親の全幅と高さを取ります。
<RelativeLayout >
<Label Text="My text"
FontSize="20"
HorizontalOptions="Center"
VerticalOptions="Center"
RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent,Property=Height,Factor=1,Constant=0}"
RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent,Property=Width,Factor=1,Constant=0}" />
</RelativeLayout>
ネストされたグリッドを使用することで、これを正常に実現できました。これが誰かを助けることを願っています!
<Grid HorizontalOptions="Fill" Padding="5,2">
<Grid Margin="8, 85,8,0" VerticalOptions="Center" RowSpacing="0" >
<Label Grid.Row="0" x:Name="PostTitle" HorizontalTextAlignment="Center" VerticalTextAlignment="Center"
Text="Display Text" Padding="10,10" LineHeight="20" BackgroundColor="Black" TextColor="WhiteSmoke" />
<Label Grid.Row="1" x:Name="PostDate" HorizontalTextAlignment="Center" VerticalTextAlignment="Center"
Text="Your Text Here" FontSize="Micro" Padding="10,10" LineHeight="10"
BackgroundColor="Black" TextColor="WhiteSmoke" />
</Grid>
</Grid>
UITableViewCellTextLabelのテキストを正当化するには-XamarinIOS
UIStringAttributes stringAttributes = new UIStringAttributes
{
ParagraphStyle = new NSMutableParagraphStyle() { Alignment = UITextAlignment.Justified }
};
var attributedText = new NSMutableAttributedString(cell.TextLabel.Text);
attributedText.AddAttributes(stringAttributes, new NSRange(0, cell.TextLabel.Text.Length));
cell.TextLabel.AttributedText = attributedText;
ラベル内で直接実行することはできないため、回避策はXamarin.Forms3の新しいFlexLayout
を使用することです。アイデアは、テキストをスペース文字で分割し、対応するラベルをFlexLayout
JustifyContent
をSpaceBetween
に設定します。
例:
[〜#〜] xaml [〜#〜]
<Frame
HorizontalOptions="Center"
Margin="20,50,20,0"
Padding="10"
WidthRequest="300"
HasShadow="true">
<FlexLayout
x:Name="TextContainer"
Direction="Row"
AlignItems="End"
JustifyContent="SpaceBetween"
Wrap="Wrap"/>
</Frame>
コードビハインド
var textparts = "This is a long text to be justified"
.Split(' ', StringSplitOptions.RemoveEmptyEntries)
.Select(x => new Label
{
Text = x,
FontSize = 12,
TextColor = Color.FromHex("#555555"),
Margin = new Thickness(1, 0)
});
foreach (var textpart in textparts)
TextContainer.Children.Add(textpart);