如何在 Xamarin.Forms 中以编程方式模拟或触发 Enter 或 Return 键

How to Simulate or Trigger Enter or Return key programmatically in Xamarin.Forms

我有一个扫描条形码的相机扫描仪应用程序,结果返回到 Entry 字段。

我可以聚焦那个 Entry 字段,但我无法让它以编程方式按回车键,有没有办法在 Xamarin.Forms 中做到这一点?

我的目标平台是 Android。

Enter 或 Return 键按下将触发 Completed 事件。我使用按钮将焦点设置到条目,然后在 Focused 事件中模拟 Enter press。

    private void Button_Clicked(object sender, EventArgs e)
    {
        entry.Focus();
    }

    private void entry_Focused(object sender, FocusEventArgs e)
    {
        entry_Completed(sender, e);
    }

    private void entry_Completed(object sender, EventArgs e)
    {
        entry.Text = "Hello";
        entry.Unfocus();
    }

这是问题的一个小复制,相当简单。

在XAML中:

<Entry Name="entry" Completed="OnCompleted"/>
<Label Name="label"/>
<Button Text="PRESS ENTER" Clicked="OnButtonPressed"/>

在 C# 或代码后面我有:

void OnCompleted(object sender, EventArgs e) 
{
    label.Text = entry.Text;
}

void OnButtonPressed (object sender, EventArgs e)
{
    // we will be adding this code here at the last step
}

然后创建一个 Interface,因为唯一简单的方法是通过 DependencyService:

使用本机 android 功能
public Interface IEnterService
{
    void PressEnter();
}

然后在Android项目中你需要创建一个class例如:EnterService 并像这样实现之前创建的接口:

[assembly: Xamarin.Forms.Dependency(typeof(EnterService))]
namespace TestEnterPressed.Droid
{
    [Register("sendKeyDownUpSync", "(I)V", "GetSendKeyDownUpSync_IHandler")]
    class EnterService : IEnterService
    {
        public void PressEnter()
        {
            Console.WriteLine("ENTER IS PRESSED");
            Instrumentation inst = new Instrumentation();
            new Thread(() =>
            {
                Thread.CurrentThread.IsBackground = true;
                
                /* run your code here */
                inst.SendKeyDownUpSync(Keycode.Enter);
            }).Start();
        }
    }
}

然后在最后一步中使用您的 DependencyService 模拟通过键盘以外的按钮按下 Enter 或在使用相机扫描条形码后,您可以这样做:

void OnButtonPressed(object sender, EventArgs e)
{
    entry.Focus();
    DependencyService.Get<IEnterService>().PressEnter();
}

我希望这对某些人有用,非常感谢大家:)