Xamarin.forms 使用Xamarin表单在页面级别处理键盘输入

Xamarin.forms 使用Xamarin表单在页面级别处理键盘输入,xamarin.forms,xamarin.android,Xamarin.forms,Xamarin.android,我正在从事一个Xamarin表单项目,其中一个要求是识别某些按键以触发热键操作。我们将部署应用程序以连接物理键盘的设备。目前,Android是唯一的目标平台 根据我昨天下午做的一些研究,听起来似乎需要一个定制的页面渲染器。今天早上我在玩这个概念的时候,偶然发现了活动课的关键方法 我尝试将以下内容添加到Android项目中的MainActivity类中: public override bool OnKeyUp([GeneratedEnum] Keycode keyCode, KeyEvent e

我正在从事一个Xamarin表单项目,其中一个要求是识别某些按键以触发热键操作。我们将部署应用程序以连接物理键盘的设备。目前,Android是唯一的目标平台

根据我昨天下午做的一些研究,听起来似乎需要一个定制的页面渲染器。今天早上我在玩这个概念的时候,偶然发现了活动课的关键方法

我尝试将以下内容添加到Android项目中的
MainActivity
类中:

public override bool OnKeyUp([GeneratedEnum] Keycode keyCode, KeyEvent e)
{
    return base.OnKeyUp(keyCode, e);
}
在这个方法上放置一个断点似乎表明这段代码就是所需要的(读取,每当我按下键盘上的键时,就会触发这个方法)

问题是,当页面上的入口控件具有焦点时,也会触发此方法。难道按键不应该由入口控制来处理,而不是冒泡进入页面吗


总的来说,这是我想要实现的目标的正确方法吗?有没有其他方法可以让我找到,这样可能会更好?

当我使用硬件设备时,我不得不做类似的事情。我在Xamarin.android端为一个条目创建了一个自定义渲染器。这将捕获不同事件中硬键和软键的回车键。我认为像您这样为页面创建自定义渲染也可以,但这只会捕获聚焦元素的按键。这对我来说很有用,因为当用户按下hardware Enter键时,条目处于焦点位置

    [assembly: ExportRenderer(typeof(CustomEntry), typeof(CustomEntryRenderer))]
    namespace Project.Droid.Controls {
        public class CustomEntryRenderer : EntryRenderer {

            public CustomEntryRenderer(Context context) : base(context) {


            }

            protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) {
                base.OnElementChanged(e);

                Control.EditorAction += Control_EditorAction;
                Control.KeyPress += NativeEditText_KeyPress;
            }



            // Fires only for Soft Keyboard
            private void Control_EditorAction(object sender, Android.Widget.TextView.EditorActionEventArgs e) {
                if (e.ActionId == ImeAction.Done) {
                    // your code
                    e.Handled = true;
                }
            }

            // Fires for Hard Keyboard
            private void NativeEditText_KeyPress(object sender, KeyEventArgs e) {
                if (e.KeyCode == Keycode.Enter && e.Event.Action == KeyEventActions.Up) {
                    // your code
                    e.Handled = true;
                }
                else
                    e.Handled = false;
            }

        }
    }

[程序集:ExportRenderer(typeof(CustomEntry)、typeof(CustomEntryRenderer))]
命名空间Project.Droid.Controls{
公共类CustomEntryRenderer:EntryRenderer{
公共CustomEntryRenderer(上下文):基本(上下文){
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e){
基础。一个要素发生变化(e);
Control.EditorAction+=Control\u EditorAction;
Control.KeyPress+=NativeEditText_KeyPress;
}
//仅对软键盘触发
私有void控件_EditorAction(对象发送方,Android.Widget.TextView.EditorActionEventArgs e){
if(e.ActionId==ImeAction.Done){
//你的代码
e、 已处理=正确;
}
}
//硬键盘火灾
私有void NativeEditText_按键(对象发送方,KeyEventArgs e){
if(e.KeyCode==KeyCode.Enter&&e.Event.Action==KeyEventActions.Up){
//你的代码
e、 已处理=正确;
}
其他的
e、 已处理=错误;
}
}
}

仅供参考:我还尝试了您正在使用的MainActivity事件,但它对我无效。我想不起为什么。

我认为最好的方法是处理viewmodel中的条目输入,并从那里向视图触发逻辑。我想我可能会朝着与您描述的方向稍有不同的方向前进。我将把你的答案标记为公认的解决方案,因为它使我走上了正确的道路。谢谢。请告诉我你最后走的路。很高兴知道。