如何在Xamarin表单中用下划线效果标注下划线?

时间:2017-03-24 09:58:34

标签: xamarin xamarin.forms

我按照this教程创建了下划线效果。但是,当我的页面启动时,它会被捕获,无一例外。有没有人设法创建下划线效果?这是一个代码:

UnderlineEffect.cs:

namespace XX.CustomForms
{
    public class UnderlineEffect : RoutingEffect
    {
        public const string EffectNamespace = "XX.CustomForms";

        public UnderlineEffect() : base($"{EffectNamespace}.{nameof(UnderlineEffect)}")
        {
        }
    }
}

UnderlineLabel_Droid.cs:

[assembly: ResolutionGroupName(UnderlineEffect.EffectNamespace)]
[assembly: ExportEffect(typeof(UnderlineEffect), nameof(UnderlineEffect))]
namespace XX.Droid.Renderers
{
    public class UnderlineEffect : PlatformEffect
    {
        protected override void OnAttached()
        {
            SetUnderline(true);
        }

        protected override void OnDetached()
        {
            SetUnderline(false);
        }

        protected override void OnElementPropertyChanged(System.ComponentModel.PropertyChangedEventArgs args)
        {
            base.OnElementPropertyChanged(args);

            if (args.PropertyName == Label.TextProperty.PropertyName || args.PropertyName == Label.FormattedTextProperty.PropertyName)
            {
                SetUnderline(true);
            }
        }

        private void SetUnderline(bool underlined)
        {
            try
            {
                var textView = (TextView)Control;
                if (underlined)
                {
                    textView.PaintFlags |= PaintFlags.UnderlineText;
                }
                else
                {
                    textView.PaintFlags &= ~PaintFlags.UnderlineText;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Cannot underline Label. Error: ", ex.Message);
            }
        }
    }
}

我的xaml:

    xmlns:custom="clr-namespace:XX.CustomForms;assembly=XX"

    <Label Text="Privacy Notice" HorizontalTextAlignment="Center" >
        <Label.Effects>
            <custom:UnderlineEffect />
        </Label.Effects>
    </Label>

4 个答案:

答案 0 :(得分:15)

Xamarin表单为TextDecorations添加了Label属性。更新到Xamarin Forms 3.3.0+并设置:

Label label = new Label {
    TextDecorations = TextDecorations.Underline
}

Docs Link

请注意,当Label中带有下划线的ListView时,iOS上存在错误。看起来它已在3.5.0中修复并发布。我现在仍在iOS上使用自定义渲染器,直到准备好更新到最新版本为止。

GitHub issue

因此,如果尚未更新到XF 3.5.0,请继续使用iOS效果。

答案 1 :(得分:6)

某些人在Xamarin中获得带下划线的文本的长度太疯狂了。这是一种无需一千行自定义渲染器的方法。负边距技巧来自this guy

<StackLayout HorizontalOptions="Start">
    <Label Text="Underlined Text" />
    <BoxView HeightRequest="1" BackgroundColor="Purple" HorizontalOptions="FillAndExpand" Margin="0,-7,0,0" />
</StackLayout>

答案 2 :(得分:3)

为了能够为标签添加下划线,我们创建了继承自Label的自定义渲染器。

public class CustomLabel : Label
{
    public static readonly BindableProperty IsUnderlinedProperty = BindableProperty.Create("IsUnderlined", typeof(bool), typeof(CustomLabel), false);

    public bool IsUnderlined
    {
        get { return (bool) GetValue(IsUnderlinedProperty); }
        set { SetValue(IsUnderlinedProperty, value); }
    }
}

在您的xaml页面中,您可以将其用作:

<s:CustomLabel IsUnderlined="True" Text="UnderlinedText" FontSize="18" HorizontalOptions="CenterAndExpand">

请注意,s是在xaml页面的根元素中声明的名称空间。

现在Android中的渲染器会是这样的:

public class CustomLabelRenderer : LabelRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);

        if (Control != null && Element != null)
        {
            if (((CustomLabel)Element).IsUnderlined)
            {
                Control.PaintFlags = PaintFlags.UnderlineText;
            }
        }
    }
}

答案 3 :(得分:0)

使用Label类中的TextDecorations属性。

<Label Text="Underlined Text" TextDecorations="Underline"/>