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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:06:03