Xamarin.Forms消除密码输入延迟:保留原密码实现即时掩码
解决Xamarin.Forms密码输入延迟并保留原密码的方案
你的核心问题是自定义控件时直接替换Text属性导致真实密码丢失,只需额外存储真实密码,同时在界面显示掩码即可实现即时无延迟的密码输入效果:
- 修改自定义
NoDelayEntry控件,添加私有字段存储真实密码,同时处理输入和删除逻辑:
class NoDelayEntry : Entry { private string _realPassword = string.Empty; // 提供获取真实密码的公共属性 public string RealPassword => _realPassword; public NoDelayEntry() : base() { // 关闭原生密码延迟掩码 this.IsPassword = false; this.TextChanged += OnEntryTextChanged; } private void OnEntryTextChanged(object sender, TextChangedEventArgs e) { // 处理输入:新文本长度更长,说明输入了字符 if (e.NewTextValue.Length > e.OldTextValue.Length) { // 获取新增的字符(取新文本最后一位) var newChar = e.NewTextValue[^1]; _realPassword += newChar; } // 处理删除:新文本长度更短,说明删除了字符 else if (e.NewTextValue.Length < e.OldTextValue.Length && _realPassword.Length > 0) { _realPassword = _realPassword.Substring(0, _realPassword.Length - 1); } // 界面显示掩码,避免触发重复TextChanged事件,先移除事件再赋值 this.TextChanged -= OnEntryTextChanged; this.Text = new string('●', _realPassword.Length); this.TextChanged += OnEntryTextChanged; } }
- XAML使用方式不变:
<local:NoDelayEntry x:Name="passwordEntry" Placeholder="Password" />
- 登录时获取真实密码:
// 直接通过RealPassword属性获取用户输入的真实密码 var inputPassword = passwordEntry.RealPassword; // 后续执行登录逻辑
注意点:
- 关闭原生
IsPassword属性,避免原生的延迟掩码逻辑干扰 - 修改
Text时先移除TextChanged事件,防止触发无限循环 - 区分输入和删除操作,正确维护真实密码的内容
内容的提问来源于stack exchange,提问作者Glozz
相关产品推荐
相关产品推荐

