【问题标题】:Handling Keyboard Input at the Page Level with Xamarin Forms使用 Xamarin Forms 在页面级别处理键盘输入
【发布时间】:2019-08-09 15:35:47
【问题描述】:

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

根据我昨天下午所做的一些研究,听起来好像需要自定义页面渲染器。今天早上在玩这个概念时,我偶然发现了 Activity 类的 On* 键方法。

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

public override bool OnKeyUp([GeneratedEnum] Keycode keyCode, KeyEvent e)
{
    return base.OnKeyUp(keyCode, e);
}

在此方法上放置断点似乎表明需要此代码(请注意,每当我按下键盘上的键时都会触发此方法)。

问题是当页面上的 Entry 控件具有焦点时也会触发此方法。按键不应该由 Entry 控件处理,而不是冒泡到页面吗?

一般来说,这是我想要完成的正确方法吗?还有其他方法可以让我指出可能会更好吗?

【问题讨论】:

  • 我相信最好的方法是处理视图模型中的条目输入并将逻辑从那里触发到视图。

标签: xamarin.forms xamarin.android


【解决方案1】:

当我使用硬件设备时,我不得不做类似的事情。我为 Xamarin.android 端的条目创建了一个自定义渲染器。这将捕获不同事件中硬键和软键的 Enter 键按下。我认为像你一样为页面创建自定义渲染也可以,但这只会捕获焦点元素的按键。这对我有用,因为当用户按下硬件 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;
            }

        }
    }

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

【讨论】:

  • 我想我可能会朝着与您描述的方向略有不同的方向前进。我会将您的答案标记为已接受的解决方案,因为它使我走上了正确的道路。
  • 谢谢。请让我知道你最后走的路。很高兴知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
相关资源
最近更新 更多