在使用MVVMCross的Xamarin.Android项目中实现文本下划线
在MVVMCross的Xamarin.Android项目中给文本加下划线的实用方案
嘿,我来帮你搞定这个问题!之前的方法没生效,大概率是因为你用了MVVMCross的动态绑定,普通的XML属性有时候hold不住动态文本,给你几个针对性的解决方案,按需选就行:
1. 固定文本直接用XML属性(最简单)
如果你的文本是写死在布局里的,直接给TextView加android:textStyle="underline"就行,代码如下:
<TextView android:id="@+id/fixed_underlined_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我是固定下划线文本" android:textStyle="underline" />
2. 动态绑定文本的场景(MVVM常用)
因为你用的是MVVMCross,文本大概率是绑定ViewModel的属性,这时候得用Spannable或者自定义绑定来处理:
方案A:ViewModel层处理(符合MVVM原则)
在ViewModel里定义一个返回SpannableString的属性,直接把文本转成带下划线的格式:
private string _originalText; // 假设这是你原本要绑定的文本属性 public string OriginalText { get => _originalText; set { _originalText = value; RaisePropertyChanged(nameof(UnderlinedText)); // 更新下划线文本的通知 } } // 供绑定的下划线文本属性 public SpannableString UnderlinedText { get { var spannable = new SpannableString(OriginalText ?? string.Empty); spannable.SetSpan(new UnderlineSpan(), 0, spannable.Length(), SpanTypes.ExclusiveExclusive); return spannable; } }
然后在.axml里绑定这个UnderlinedText属性:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" local:MvxBind="Text UnderlinedText" />
方案B:自定义MVVMCross绑定(复用性强)
如果多个页面都需要下划线文本,写个自定义绑定更省心:
- 先创建绑定类:
public class UnderlineTextBinding : MvxAndroidTargetBinding { private TextView _textView; public UnderlineTextBinding(TextView target) : base(target) { _textView = target; } public override Type TargetType => typeof(string); protected override void SetValueImpl(object target, object value) { if (_textView == null || value == null) return; var text = value.ToString(); var spannable = new SpannableString(text); spannable.SetSpan(new UnderlineSpan(), 0, text.Length, SpanTypes.ExclusiveExclusive); _textView.TextFormatted = spannable; } protected override void Dispose(bool isDisposing) { if (isDisposing) { _textView = null; } base.Dispose(isDisposing); } }
- 在项目的Setup.cs里注册这个绑定:
protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry) { base.FillTargetFactories(registry); // 注册自定义绑定,命名为UnderlineText registry.RegisterCustomBindingFactory<TextView>("UnderlineText", view => new UnderlineTextBinding(view)); }
- 最后在.axml里直接用这个自定义绑定:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" local:MvxBind="UnderlineText OriginalText" />
这里的OriginalText就是你ViewModel里原本的文本属性。
3. HTML格式快速实现(懒人必备)
如果你的文本允许用HTML标签,直接返回带<u>的字符串,再用MVVMCross自带的Html转换器就行:
ViewModel里:
public string MyUnderlinedText => "<u>这是用HTML实现的下划线文本</u>";
.axml里绑定FormattedText并指定Html转换器:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" local:MvxBind="FormattedText MyUnderlinedText, Converter=Html" />
如果之前你只加了android:textStyle="underline"但没生效,基本就是因为文本是动态绑定的,这个属性对动态更新的文本有时候不会触发样式更新,用上面的任意一种方法都能解决问题。
内容的提问来源于stack exchange,提问作者NaSt
相关产品推荐
相关产品推荐

