.NET 7 Android平台Entry控件设TextTransform=Uppercase后输入内容反转
解决.NET MAUI .NET7 Android Entry文本反转问题
这是.NET 7 Android平台Entry控件的已知bug,和TextTransform及MaskedBehavior处理文本时的字符顺序反转逻辑有关,给你几个可行的解决办法:
1. 自定义EntryHandler修复TextTransform大写反转
在Android平台项目(比如Platforms/Android/Program.cs)中添加自定义Handler,替换默认的文本变换逻辑,避免反转:
using Microsoft.Maui.Handlers; using Android.Text.Method; using Android.Views; using Java.Lang; namespace YourAppName.Platforms.Android; public static class EntryFixes { public static void ApplyTextTransformFix() { EntryHandler.Mapper.AppendToMapping("FixUppercaseReverse", (handler, view) => { if (view is Entry entry && entry.TextTransform == TextTransform.Uppercase) { handler.PlatformView.SetTransformationMethod(new UpperCaseFixTransformation()); } }); } } public class UpperCaseFixTransformation : TransformationMethod { public ICharSequence GetTransformation(ICharSequence source, View view) { // 直接转大写,避开系统自带的可能导致反转的逻辑 return new String(source.ToString().ToUpperInvariant()); } public void OnFocusChanged(View view, ICharSequence sourceText, bool focused, int direction, Rect previouslyFocusedRect) { // 无需额外处理 } }
然后在Platforms/Android/MainApplication.cs的OnCreate方法里调用修复逻辑:
EntryFixes.ApplyTextTransformFix();
2. 修复MAUI Community Toolkit MaskedBehavior的反转问题
如果MaskedBehavior也出现反转,建议暂时绕过控件自带的变换,手动在TextChanged事件里处理掩码和大写:
private void Entry_TextChanged(object sender, TextChangedEventArgs e) { if (sender is not Entry entry) return; // 先清理非允许字符(比如只保留数字/字母,根据你的掩码需求调整) var cleanInput = new string(e.NewTextValue.Where(c => char.IsLetterOrDigit(c)).ToArray()); // 应用自定义掩码(示例为身份证格式:XXX-XX-XXXXXX-X) var maskedText = ApplyCustomMask(cleanInput); // 转大写 var finalText = maskedText.ToUpperInvariant(); // 避免循环触发TextChanged事件 if (entry.Text != finalText) { entry.Text = finalText; // 保持光标在文本末尾,提升输入体验 entry.CursorPosition = finalText.Length; } } private string ApplyCustomMask(string input) { if (string.IsNullOrEmpty(input)) return string.Empty; StringBuilder sb = new StringBuilder(); int index = 0; // 拼接前3位 if (index < input.Length) sb.Append(input.Substring(index, Math.Min(3, input.Length - index))); index += 3; if (index < input.Length) sb.Append("-"); // 拼接中间2位 if (index < input.Length) sb.Append(input.Substring(index, Math.Min(2, input.Length - index))); index += 2; if (index < input.Length) sb.Append("-"); // 拼接中间6位 if (index < input.Length) sb.Append(input.Substring(index, Math.Min(6, input.Length - index))); index += 6; if (index < input.Length) sb.Append("-"); // 拼接最后1位 if (index < input.Length) sb.Append(input.Substring(index)); return sb.ToString(); }
3. 终极解决方案:升级到.NET 8
微软在.NET 8中已经彻底修复了Android平台的文本变换反转bug,如果项目允许升级,直接迁移到.NET 8是最省心的办法,不需要额外编写修复代码。
内容的提问来源于stack exchange,提问作者smart ids
相关产品推荐
相关产品推荐

