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

Xamarin Forms中如何为Entry控件实现支持属性绑定的删除线文本

实现方案

实现思路

由于Xamarin Forms原生Entry未暴露删除线配置属性,我们通过自定义控件+平台渲染器的方案实现,完全原生渲染,支持属性绑定动态切换状态,无Unicode字符集的兼容性问题。

步骤1:共享项目创建自定义Entry控件

public class StrikethroughEntry : Entry
{
    public static readonly BindableProperty IsTextStrikethroughProperty = 
        BindableProperty.Create(
            nameof(IsTextStrikethrough),
            typeof(bool),
            typeof(StrikethroughEntry),
            false,
            propertyChanged: OnStrikethroughChanged);

    public bool IsTextStrikethrough
    {
        get => (bool)GetValue(IsTextStrikethroughProperty);
        set => SetValue(IsTextStrikethroughProperty, value);
    }

    private static void OnStrikethroughChanged(BindableObject bindable, object oldValue, object newValue)
    {
        // 平台渲染器会监听属性变化自动更新效果
    }
}

步骤2:安卓平台实现渲染器

在安卓项目中创建渲染器类:

[assembly: ExportRenderer(typeof(StrikethroughEntry), typeof(StrikethroughEntryRenderer))]
namespace YourAppNamespace.Droid.Renderers
{
    public class StrikethroughEntryRenderer : EntryRenderer
    {
        public StrikethroughEntryRenderer(Context context) : base(context) { }

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);
            if (Control != null && e.NewElement is StrikethroughEntry entry)
            {
                UpdateStrikethrough(entry);
            }
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == nameof(StrikethroughEntry.IsTextStrikethrough) 
                || e.PropertyName == nameof(Entry.Text) 
                && sender is StrikethroughEntry entry)
            {
                UpdateStrikethrough(entry);
            }
        }

        private void UpdateStrikethrough(StrikethroughEntry entry)
        {
            if (entry.IsTextStrikethrough)
            {
                Control.PaintFlags |= PaintFlags.StrikeThruText;
            }
            else
            {
                Control.PaintFlags &= ~PaintFlags.StrikeThruText;
            }
        }
    }
}

步骤3:iOS平台实现渲染器

在iOS项目中创建渲染器类:

[assembly: ExportRenderer(typeof(StrikethroughEntry), typeof(StrikethroughEntryRenderer))]
namespace YourAppNamespace.iOS.Renderers
{
    public class StrikethroughEntryRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);
            if (Control != null && e.NewElement is StrikethroughEntry entry)
            {
                UpdateStrikethrough(entry);
            }
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == nameof(StrikethroughEntry.IsTextStrikethrough) 
                || e.PropertyName == nameof(Entry.Text) 
                && sender is StrikethroughEntry entry)
            {
                UpdateStrikethrough(entry);
            }
        }

        private void UpdateStrikethrough(StrikethroughEntry entry)
        {
            if (string.IsNullOrEmpty(entry.Text)) return;

            var attrString = new NSMutableAttributedString(entry.Text);
            if (entry.IsTextStrikethrough)
            {
                attrString.AddAttribute(
                    UIStringAttributeKey.StrikethroughStyle,
                    NSNumber.FromInt32((int)NSUnderlineStyle.Single),
                    new NSRange(0, entry.Text.Length));
            }
            Control.AttributedText = attrString;
        }
    }
}

步骤4:使用方式

在XAML中直接绑定属性即可动态切换删除线状态:

<local:StrikethroughEntry 
    Text="sddad"
    IsTextStrikethrough="{Binding NeedStrikethrough}" />

修改绑定的NeedStrikethrough布尔值即可实时更新Entry文本的删除线效果,输入新内容时也会自动应用删除线配置。

内容的提问来源于stack exchange,提问作者Khandakar Rashed Hassan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:24:07