如何防止标签被截断?

时间:2019-11-04 23:04:27

标签: c# xamarin

我正在对Label的翻译进行动画处理,以在文本太长而无法显示时水平滚动它,但是我遇到了问题...当我使用{时,标签会截断长文本{1}},使滚动变得毫无意义。

LineBreakMode="NoWrap"

enter image description here

我尝试将MinimumWidthRequest设置为一个非常大的数字,但没有帮助。

如何使标签的宽度扩展到文本的总长度并禁止截断?

1 个答案:

答案 0 :(得分:1)

NoWrap –不换行,仅显示一行中可以容纳的所有文本

因此,如果您的内容太长,它仍会截断。

如果要让长文本标签显示在一行上并可以自动滚动。

您可以写一个CustomRenderer以达到效果。

创建自定义 MarqueeLabel

public class MarqueeLabel :Label
{
}

在Android.Project中创建自定义TextView MaqueeText

class MaqueeText :TextView
{
    protected MaqueeText(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }
    public MaqueeText(Context context) : base(context)
    {

    }
    public MaqueeText(Context context, IAttributeSet attribute) : base(context,attribute)
    {

    }
    public MaqueeText(Context context, IAttributeSet attribute,int style) : base(context,attribute,style)
    {

    }

    public override bool IsFocused => true;

}

在Android.Project中创建自定义渲染器 MaqueeTextRenderer

[assembly: ExportRenderer(typeof(MarqueeLabel), typeof(MaqueeTextRenderer))]
namespace App18.Droid
{
  class MaqueeTextRenderer :LabelRenderer
    {
      Context context;
      public MaqueeTextRenderer(Context context) : base(context)
        {
          this.context = context;
        }
      protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
           base.OnElementChanged(e);
          if (Control != null)
           {
             MaqueeText maqueeText = new MaqueeText(context);
             maqueeText.SetSingleLine(true);
             maqueeText.SetMarqueeRepeatLimit(-1);
             maqueeText.Ellipsize = TextUtils.TruncateAt.Marquee;
             maqueeText.Text = e.NewElement.Text;
             SetNativeControl(maqueeText);
           }

        }

     }
}

在ios中,类似于Android,您可以安装NugetPackage MarqueeLabel.iOS 。然后在自定义渲染器中安装

 [assembly: ExportRenderer(typeof(MarqueeLabel), typeof(MarqueeLabelRenderer))]
 namespace Test.Forms.App.iOS.Renderer
  {
     public class MarqueeLabelRenderer : LabelRenderer
      {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
         {
           var x = new MarqueeLabel.iOS.MarqueeLabel();
           SetNativeControl(x);
           base.OnElementChanged(e);
         }
     }
  }

最后在您的page.axml中:

  <local:MarqueeLabel Text="asdsdsaddsdjkfkjfldjfdfjldkfsdkf;kfd;kdf;sdkf;skf;skf;sdkf;dkf;fk;dfk;dfk;fk;fk;fk;dfk;fkfsdfk"></Label>