拦截全球事件Xamarin Forms

时间:2018-04-11 13:17:00

标签: xamarin.forms event-handling

在MainActivity.cs中我有这个方法

public override bool OnKeyUp(Keycode keyCode, KeyEvent e)
    {
        if (keyCode.ToString().Equals("F1"))
        {
            App.Left = true;
            App.Right = false;
        }
        else if (keyCode.ToString().Equals("F2"))
        {
            App.Left = false;
            App.Right = true;
        }
        else
        {
            App.Left = false;
            App.Right = false;
        }
        return base.OnKeyUp(keyCode, e);
    }

在我的Page类中,我如何不断检查左或右是否为真,以防触发事件?

1 个答案:

答案 0 :(得分:1)

  1. 使用Dependency Service创建插件,您的共享界面应如下所示:

    public interface IKeyEvent
    {
        event Action<KeyResult> OnKeyEvent;
    }
    
    public enum KeyResult {None, Left, Right};
    
  2. 相应地针对不同平台(Android / iOS / UWP)实现此功能并将其绑定到PCL项目。 (检查依赖服务实现以获取帮助)

  3. 将其链接到特定于平台的KeyUp事件。

  4. 对于android来说就像这样:

    <强> Droid.KeyEventHandler

    [assembly: Dependency(typeof(KeyEventHandler))]
    namespace YourNameSpace.Droid
    {
        public class KeyEventHandler : IKeyEvent 
        {
            public static KeyEventHandler Current;
    
            public KeyEventHandler()
            {
                Current = this;
            }
    
            public event Action<KeyResult> OnKeyResult;
    
    
            public void RaiseKeyEvent(KeyResult key)
            {
                OnKeyResult?.Invoke(key);            
            }
        }
    }
    

    <强> MainActivity

    public override bool OnKeyUp(Keycode keyCode, KeyEvent e)
    {
        KeyResult keyResult = KeyResult.None; // need to reference YourNameSpace.Shared project to use this enum
        if (keyCode == KeyCode.A)
        {
            keyResult = KeyResult.Left;
        }
        else if (keyCode == KeyCode.D))
        {
            keyResult = KeyResult.Right;
        }
        else
        {
            keyResult = KeyResult.None;
        }
    
        if (KeyEventHandler.Current != null)
        {
            KeyEventHandler.Current.RaiseKeyEvent(keyResult);
        }
    
        return base.OnKeyUp(keyCode, e);
    }
    

    注意:左右键分别映射到物理键盘的A和D,由于某些原因我的Macbook的F1 / F2键没有注册到模拟器,所以我使用了A / d。

    希望这会有所帮助:)