You can use the KeyCommands to track the key pressing from hardware keyboard.
keyCommands
A responder object that supports hardware keyboard commands can redefine this property and use it to return an array of UIKeyCommand objects that it supports. Each key command object represents the keyboard sequence to recognize and the action method of the responder to call in response.
The key commands you return from this method are applied to the entire responder chain. When an key combination is pressed that matches a key command object, UIKit walks the responder chain looking for an object that implements the corresponding action method. It calls that method on the first object it finds and then stops processing the event.
In Xamarin.forms, you have to create custom renderer for ContentPage at iOS platform. Then the keycommands can be added in that page renderer.
If you want the key presses can be handled by the ViewController(Page), not just the input controls(such as Entry), use canBecomeFirstResponder
to enable viewcontroller to become a first responder.
For example, the custom renderer of ContentPage in iOS platform could like this:
using System;
using Foundation;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using KeyCommandsInXamarinForms.iOS;
[assembly: ExportRenderer(typeof(ContentPage), typeof(MyCustomPageRenderer))]
namespace KeyCommandsInXamarinForms.iOS
{
public class MyCustomPageRenderer : PageRenderer
{
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
if (e.OldElement != null || Element == null)
{
return;
}
//Create your keycommand as you need.
UIKeyCommand keyCommand1 = UIKeyCommand.Create(new NSString("1"), UIKeyModifierFlags.Command, new ObjCRuntime.Selector("Action:"));
UIKeyCommand keyCommand2 = UIKeyCommand.Create(new NSString(""), 0, new ObjCRuntime.Selector("Action:"));
//Add your keycommands
this.AddKeyCommand(keyCommand1);
this.AddKeyCommand(keyCommand2);
}
[Export("Action:")]
private void Excute(UIKeyCommand keyCommand)
{
Console.WriteLine(String.Format("key pressed - {0}", keyCommand.Value);
}
//Enable viewcontroller to become the first responder, so it is able to respond to the key commands.
public override bool CanBecomeFirstResponder
{
get
{
return true;
}
}
}
}
Notice this line, using typeof(ContentPage)
as the handler parameter, then you don't need to change anything in your PCL:
[assembly: ExportRenderer(typeof(ContentPage), typeof(MyCustomPageRenderer))]
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…