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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:40:24