You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在使用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绑定(复用性强)

如果多个页面都需要下划线文本,写个自定义绑定更省心:

  1. 先创建绑定类:
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);
    }
}
  1. 在项目的Setup.cs里注册这个绑定:
protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
{
    base.FillTargetFactories(registry);
    // 注册自定义绑定,命名为UnderlineText
    registry.RegisterCustomBindingFactory<TextView>("UnderlineText", view => new UnderlineTextBinding(view));
}
  1. 最后在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:43:36