.NET Maui Entry控件ReturnType=Next在.NET 8 Android下失效求助
.NET 8 Android下Entry控件ReturnType=Next失效的替代解决办法
问题说明
在Android平台上,使用.NET 8目标运行时的时候,设置了ReturnType="Next"的Entry控件无法正常显示“下一步”按钮并切换焦点到下一个输入框,所有输入框都显示“完成”按钮;但相同代码在.NET 7运行时可正常工作。
使用的XAML代码:
<Entry Placeholder="Entry 1" Keyboard="Numeric" ReturnType="Next"/> <Entry Placeholder="Entry 2" Keyboard="Numeric" ReturnType="Next"/> <Entry Placeholder="Entry 3" Keyboard="Numeric" ReturnType="Next"/> <Entry Placeholder="Entry 4" Keyboard="Numeric" ReturnType="Done"/>
效果对比:
- .NET 7运行时:前三个输入框右下角显示“下一步”按钮,点击可切换到下一个输入框,最后一个显示“完成”按钮
- .NET 8运行时:所有输入框右下角均显示“完成”按钮,无法通过点击按钮切换焦点
替代解决办法
1. 自定义Android Entry Handler修改原生ImeOptions
通过自定义Handler直接修改Android原生EditText的输入法选项,强制设置为Next:
在Android平台项目中创建自定义Handler类:
using Microsoft.Maui.Handlers; using Android.Widget; using Android.Views.InputMethods; namespace YourAppNamespace.Platforms.Android; public class CustomEntryHandler : EntryHandler { protected override void ConnectHandler(EditText platformView) { base.ConnectHandler(platformView); if (VirtualView.ReturnType == Microsoft.Maui.ReturnType.Next) { // 设置输入法动作为Next platformView.ImeOptions = ImeAction.Next; platformView.SetImeActionLabel("下一步", ImeAction.Next); } } }
然后在MauiProgram.cs中注册这个自定义Handler:
builder.ConfigureMauiHandlers(handlers => { #if ANDROID handlers.AddHandler(typeof(Microsoft.Maui.Controls.Entry), typeof(YourAppNamespace.Platforms.Android.CustomEntryHandler)); #endif });
2. 手动处理Return事件实现焦点切换
绕过ReturnType的问题,通过绑定ReturnCommand手动控制焦点切换:
修改XAML代码,给每个Entry指定命令和目标控件:
<Entry x:Name="Entry1" Placeholder="Entry 1" Keyboard="Numeric" ReturnType="Next" ReturnCommand="{Binding NextFocusCommand}" ReturnCommandParameter="{x:Reference Entry2}"/> <Entry x:Name="Entry2" Placeholder="Entry 2" Keyboard="Numeric" ReturnType="Next" ReturnCommand="{Binding NextFocusCommand}" ReturnCommandParameter="{x:Reference Entry3}"/> <Entry x:Name="Entry3" Placeholder="Entry 3" Keyboard="Numeric" ReturnType="Next" ReturnCommand="{Binding NextFocusCommand}" ReturnCommandParameter="{x:Reference Entry4}"/> <Entry x:Name="Entry4" Placeholder="Entry 4" Keyboard="Numeric" ReturnType="Done"/>
在ViewModel中实现对应的命令:
using Microsoft.Maui.Controls; using System.Windows.Input; public class YourViewModel { public ICommand NextFocusCommand => new Command<VisualElement>(async (target) => { if (target != null) { await target.FocusAsync(); } }); }
3. 更新.NET 8 MAUI补丁
这个问题属于.NET 8 MAUI的已知兼容性BUG,微软后续发布的补丁可能会修复该问题。可以尝试更新到最新的.NET 8 MAUI SDK版本,检查是否解决了该问题。
内容的提问来源于stack exchange,提问作者Shades49
相关产品推荐
相关产品推荐

