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

Xamarin Forms中Entry获焦后切换布局,DispatchKeyEvent不再触发

Xamarin Forms Android 硬件键盘事件失效问题

开发背景

为Zebra扫描器开发Android平台的Xamarin Forms移动应用,通过切换StackLayout1和StackLayout2的IsVisible属性展示不同UI内容。用户仅通过扫描器硬件键盘操作,已禁用虚拟键盘。

核心问题

在Android项目的PageRenderer中重写了DispatchKeyEvent,整体运行正常,但存在以下异常场景:

  • 显示StackLayout1
  • 用户点击Entry控件使其获焦
  • 用户点击UI按钮,应用切换显示StackLayout2
  • 此时按下设备任意按键,DispatchKeyEvent均不再触发

额外测试情况

  • 若未让Entry获焦,切换到StackLayout2后DispatchKeyEvent正常触发
  • 若通过代码让StackLayout2的Entry获焦,DispatchKeyEvent也正常,但这并非可行方案
  • 尝试让StackLayout2获焦,代码执行正常但IsFocused始终为false,DispatchKeyEvent仍不触发

更新记录

更新1

为两个StackLayout添加ViewRenderer,StackLayout2显示时会触发OnElementChanged事件,但问题仍存在,焦点相关代码中IsFocused始终为false。相关代码如下:

async void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch (e.PropertyName)
    {
        case "IsVisible":
            if (Element.IsVisible) 
            {
                if (sender is StackLayout)
                {
                    this.FocusableViewAvailable(this);   // 注释这两行结果相同
                    this.Focusable = true;               // 注释这两行结果相同
                    this.FocusableInTouchMode = true;
                    var dd = this.RequestFocus();  // 始终返回false
                    var ee = this.IsFocused;       // 始终为false
                }
            }
            break;
    }
}

更新2

无需自定义StackLayout,解决方案不包含更新1内容。

寻求解决思路


内容的提问来源于stack exchange,提问作者pdschuller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:54:42