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

Xamarin.UWP中Entry失焦时Text被置空,如何获取置空前的Text值?

针对Xamarin.Forms UWP平台Entry失焦前Text被置空问题的解决方案

方案1:共享层缓存最近有效Text值(全平台兼容,改动最小)

自定义Entry控件,在TextChanged事件中缓存非空的有效值,失焦时直接读取缓存即可:

public class SafeEntry : Entry
{
    // 存储最近一次非空的有效文本值
    public string LastValidText { get; private set; }

    public SafeEntry()
    {
        TextChanged += OnTextChanged;
        Unfocused += OnUnfocused;
    }

    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        // 仅更新非空的有效值
        if (!string.IsNullOrEmpty(e.NewTextValue))
        {
            LastValidText = e.NewTextValue;
        }
        
        // 可选:过滤UWP平台失焦前触发的异常null通知
        if (Device.RuntimePlatform == Device.UWP && IsFocused && e.NewTextValue == null)
        {
            return;
        }
        // 此处放置你原有TextChanged的业务逻辑
    }

    private void OnUnfocused(object sender, FocusEventArgs e)
    {
        // 直接读取缓存的LastValidText即可得到失焦前的原值
        var originalText = LastValidText;
        // 此处放置你原有Unfocused的业务逻辑
    }
}

使用时把原有Xaml中的Entry替换为SafeEntry即可。


方案2:UWP自定义渲染器修复原生行为(根源对齐多平台逻辑)

通过UWP平台的自定义渲染器,阻止原生控件失焦时自动置空Text的异常行为,共享层无需修改业务逻辑:

  1. 首先在UWP项目中添加自定义渲染器类:
using Xamarin.Forms;
using Xamarin.Forms.Platform.UWP;
using YourAppNamespace;
using YourAppNamespace.UWP.Renderers;

[assembly: ExportRenderer(typeof(Entry), typeof(FixedEntryRenderer))]
namespace YourAppNamespace.UWP.Renderers
{
    public class FixedEntryRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {
                // 监听原生控件失焦事件,强制同步正确的文本值到Forms层
                Control.LostFocus += (sender, args) =>
                {
                    if (Element == null) return;
                    // 若Forms层Text被异常置空,用原生控件的实际文本覆盖
                    if (string.IsNullOrEmpty(Element.Text) && !string.IsNullOrEmpty(Control.Text))
                    {
                        Element.Text = Control.Text;
                    }
                };
            }
        }
    }
}

该方案修复后UWP平台的事件触发顺序、Text值表现将和Android、iOS完全一致。


方案3:业务逻辑层临时过滤异常通知

如果不想自定义控件或渲染器,可直接在原有业务代码中加平台判断,忽略UWP的异常null通知:

yourEntry.TextChanged += (s, e) =>
{
    // 过滤UWP平台聚焦状态下收到的异常null通知
    if (Device.RuntimePlatform == Device.UWP && yourEntry.IsFocused && e.NewTextValue == null)
    {
        return;
    }
    // 原有TextChanged业务逻辑
};

yourEntry.Unfocused += (s, e) =>
{
    // 渲染器修复后此处可直接读取yourEntry.Text,若用方案1则读取LastValidText
    var text = yourEntry.Text;
    // 原有Unfocused业务逻辑
};

内容的提问来源于stack exchange,提问作者Kikanye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:06:04