在Editor控件中如何实现与Entry的Completed事件一致的触发行为?
Editor控件按回车键触发Completed事件实现方案
原生Editor默认Completed事件触发规则
各平台默认触发逻辑:
- iOS:编辑器失去焦点 或 按下「完成」按钮时触发
- Android/Windows Phone:仅当编辑器失去焦点时触发
如果需要实现和Entry控件一致的「按下回车键即触发完成事件」的行为,可以参考以下实现方案,分别适配MAUI和Xamarin.Forms场景:
方案1:MAUI 平台处理器(Handler)实现
步骤1:共享项目创建自定义Editor类
public class ReturnableEditor : Editor { /// <summary> /// 按下回车键时触发 /// </summary> public event EventHandler ReturnPressed; public void OnReturnPressed() => ReturnPressed?.Invoke(this, EventArgs.Empty); }
步骤2:各平台实现Handler
安卓平台(放在Platforms/Android目录下)
public class ReturnableEditorHandler : EditorHandler { protected override void ConnectHandler(EditText platformView) { base.ConnectHandler(platformView); platformView.EditorAction += (sender, e) => { // 匹配回车、完成、下一步按键动作 if (e.ActionId is ImeAction.Done or ImeAction.Next || (e.Event?.KeyCode == Keycode.Enter && e.Event.Action == KeyEventActions.Up)) { (VirtualView as ReturnableEditor)?.OnReturnPressed(); // 如果需要保留输入的换行符,删除下一行即可 e.Handled = true; } }; } }
iOS平台(放在Platforms/iOS目录下)
public class ReturnableEditorHandler : EditorHandler { protected override void ConnectHandler(UITextView platformView) { base.ConnectHandler(platformView); platformView.ShouldChangeText += (textView, range, replacementText) => { if (replacementText == "\n") { (VirtualView as ReturnableEditor)?.OnReturnPressed(); // 如果需要保留输入的换行符,改回return true即可 return false; } return true; }; } }
步骤3:注册Handler
在MauiProgram.cs的CreateMauiApp方法中添加Handler注册:
public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureMauiHandlers(handlers => { handlers.AddHandler(typeof(ReturnableEditor), typeof(ReturnableEditorHandler)); }); return builder.Build(); }
方案2:Xamarin.Forms 自定义渲染器实现
步骤1:共享项目创建自定义Editor类
public class ReturnableEditor : Editor { /// <summary> /// 按下回车键时触发 /// </summary> public event EventHandler ReturnPressed; }
步骤2:各平台实现渲染器
安卓平台
[assembly: ExportRenderer(typeof(ReturnableEditor), typeof(ReturnableEditorRenderer))] namespace 你的项目命名空间.Droid.Renderers { public class ReturnableEditorRenderer : EditorRenderer { public ReturnableEditorRenderer(Context context) : base(context) { } protected override void OnElementChanged(ElementChangedEventArgs<Editor> e) { base.OnElementChanged(e); if (Control != null && e.NewElement is ReturnableEditor returnableEditor) { Control.EditorAction += (sender, args) => { if (args.ActionId == ImeAction.Done || (args.Event?.KeyCode == Keycode.Enter && args.Event.Action == KeyEventActions.Up)) { returnableEditor.ReturnPressed?.Invoke(this, EventArgs.Empty); // 需要保留换行则删除下一行 args.Handled = true; } }; } } } }
iOS平台
[assembly: ExportRenderer(typeof(ReturnableEditor), typeof(ReturnableEditorRenderer))] namespace 你的项目命名空间.iOS.Renderers { public class ReturnableEditorRenderer : EditorRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Editor> e) { base.OnElementChanged(e); if (Control != null && e.NewElement is ReturnableEditor returnableEditor) { Control.ShouldChangeText += (textView, range, replacementText) => { if (replacementText == "\n") { returnableEditor.ReturnPressed?.Invoke(this, EventArgs.Empty); // 需要保留换行则改为return true return false; } return true; }; } } } }
控件使用方法
直接在XAML中声明控件并绑定事件即可:
<ContentPage xmlns:local="clr-namespace:你的共享项目命名空间"> <local:ReturnableEditor x:Name="MyEditor" ReturnPressed="MyEditor_ReturnPressed"/> </ContentPage>
后台事件处理逻辑:
private void MyEditor_ReturnPressed(object sender, EventArgs e) { // 此处填写回车触发后的业务逻辑,和Entry的Completed事件处理逻辑一致 // 例:隐藏键盘、提交输入内容等 MyEditor.Unfocus(); }
内容的提问来源于stack exchange,提问作者Khandakar Rashed Hassan
相关产品推荐
相关产品推荐

