我按照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>
答案 0 :(得分:15)
Xamarin表单为TextDecorations
添加了Label
属性。更新到Xamarin Forms 3.3.0+并设置:
Label label = new Label {
TextDecorations = TextDecorations.Underline
}
请注意,当Label
中带有下划线的ListView
时,iOS上存在错误。看起来它已在3.5.0中修复并发布。我现在仍在iOS上使用自定义渲染器,直到准备好更新到最新版本为止。
因此,如果尚未更新到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"/>