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的异常行为,共享层无需修改业务逻辑:
- 首先在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
相关产品推荐
相关产品推荐

