C# Metro应用程序中的键盘快捷键

C# Metro应用程序中的键盘快捷键,c#,.net,xaml,windows-8,microsoft-metro,C#,.net,Xaml,Windows 8,Microsoft Metro,无论哪个控件具有焦点,如何捕获键盘快捷键?我不想为每个用户可能关注的控件编写相同的内容。那么,如何查看页面范围/独立于控件的快捷方式呢?在根元素上设置事件处理程序怎么样?我认为,如果不在其他任何地方处理该事件,它最终将到达父控件。 下面是一个简单的按键事件 <common:LayoutAwarePage x:Name="pageRoot" //elided xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:

无论哪个控件具有焦点,如何捕获键盘快捷键?我不想为每个用户可能关注的控件编写相同的内容。那么,如何查看页面范围/独立于控件的快捷方式呢?

在根元素上设置事件处理程序怎么样?我认为,如果不在其他任何地方处理该事件,它最终将到达父控件。 下面是一个简单的按键事件

<common:LayoutAwarePage
x:Name="pageRoot"
//elided
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" KeyDown="MyEventHandler">

将此代码添加到构造函数中,它将处理全局键down和key

Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
        Window.Current.CoreWindow.KeyUp += CoreWindow_KeyUp;
以下是他们的活动

void CoreWindow_KeyUp(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args)
    {
        //this.Frame.Navigate(typeof(MainPage));
        var key = args.VirtualKey;
        string aa = args.ToString();
    }

    void CoreWindow_KeyDown(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args)
    {
        //this.Frame.Navigate(typeof(MainPage));
        var key = args.VirtualKey;
        string aa = args.ToString();
    }

您可以在此事件中处理自己的逻辑。

最好的解决方案是按照前面的建议使用根元素,因为全局快捷方式使用应用于每个页面的一个类的函数,这意味着必须在每个页面上分别处理每个快捷方式,否则会出现错误

我的XAML设置如下:

<Page
   Name="root"
    ...>

    ...

</Page>
当窗口打开时,通过表达式
root.KeyDown+=root\u KeyDown
可通过任何按键访问名称
root
。这将调用
Root\u KeyDown()
方法,然后该方法可以基于按键参数
KeyRoutedEventArgs e
发送的键实现任何函数

我的代码实现了一个
switch
语句来确定关键函数

... 
namespace DenisQuiz.UWP
{
   public sealed partial class StudyADeck : Page
   {
      ...
      public StudyADeck()
      {
         ...
         // Keyboard shortcuts
         root.KeyDown += Root_KeyDown;
      }

      private void Root_KeyDown(object sender, KeyRoutedEventArgs e)
      {
         switch (e.Key)
         {
            case Windows.System.VirtualKey.F:
               FlipCard();
               break;
            case Windows.System.VirtualKey.Right:
               NextCard();
               break;
            case Windows.System.VirtualKey.Left:
               PreviousCard();
               break;
            case Windows.System.VirtualKey.S:
               Frame.GoBack(); // Stop Studying
               break;
            case Windows.System.VirtualKey.E:
               Frame.Navigate(typeof(EditANotecard)); // Edit this card
               break;
            case Windows.System.VirtualKey.D:
               DeleteNotecardAsync();
               break;
            default:
               break;
         }
      }
...