web-dev-qa-db-ja.com

Xamarinフォームラベル-正当化?

ラベルテキストを正当化する方法があるかどうかを尋ねたかっただけです。 Xamarin FormsXamlを使用しています。

ありがとう。

PDATE:今のところ、テキストを正当化するはできません。ほとんどの答えはテキストの中央揃えに関するものでしたが、それは私が尋ねたものではありません。 1つの方法は、ティモシーのようにレンダラーを使用することです。

8
ainer

Xamarin.Forms機能を使用してラベルのテキストを全幅に拡大することはできませんが、プラットフォームレンダラーを使用すると簡単に実現できます。

Android text justification in Xamarin.Froms label

ほとんどの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;
                }

            }
        }
    }
}
  1. ネイティブプロジェクトでのレンダラークラスの作成
  2. Assembly:ExportRenderer属性を追加します
  3. TextViewのJustificationModeを設定します

私の例では、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); }
        }
    }
}
5
Maxim Saplin

これを行う現在の方法は、HorizontalTextAlignmentを使用することであり、TextAlignment列挙の値は次のとおりです。

  • Center =中央揃えのテキスト
  • Start =左揃え
  • End =右揃え

ラベルとそのテキストを中央揃え例:

<Label x:Name="Description" HorizontalTextAlignment="Center" VerticalOptions="Center" HorizontalOptions="Center" />

6

XAlignプロパティを使用します

Label lbl = new Label();
lbl.Text = "I'm a Label!";
lbl.XAlign = TextAligntment.Start; // Start, Center, End are valid
1
Jason

テキストを保持するためにどのような種類のコンテナを使用していますか? XAlignとともにFillAndExpandのHorizo​​ntalOptionsを使用してStackLayoutを使用すると、それが可能になる場合がありますが、テキストがコントロールごとに1行しかない場合に限ります。

0
Mathieson

Xamlでは、htmlを使用してテキストを正当化できます。

<Label LineBreakMode="WordWrap" TextType="Html" TextColor="Black">
<Label.Text>&lt;p style=&quot;text-align:justify;&quot;&gt; 
Your text here
&lt;p&gt;</Label.Text>
0

これを試して:

<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>
0
Victor Madurga

相対レイアウトでラベルを使用する場合は、ラベルを正当化できます。

秘訣は、親ごとに幅と高さを入力する必要があることです。

だから私は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>
0
Ranjith Kumar

ネストされたグリッドを使用することで、これを正常に実現できました。これが誰かを助けることを願っています!

<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>
0
technified

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;
0
Gihan Sandaru

ラベル内で直接実行することはできないため、回避策はXamarin.Forms3の新しいFlexLayoutを使用することです。アイデアは、テキストをスペース文字で分割し、対応するラベルをFlexLayoutJustifyContentSpaceBetweenに設定します。

例:

[〜#〜] 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);
0
Mattes67