【问题标题】:Keyboard shortcuts in Metro appsMetro 应用程序中的键盘快捷键
【发布时间】:2013-02-07 12:19:18
【问题描述】:

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

【问题讨论】:

    标签: c# .net xaml windows-8 microsoft-metro


    【解决方案1】:

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

    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();
        }
    

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

    【讨论】:

      【解决方案2】:

      如何在根元素上设置事件处理程序?我认为事件最终会到达父控件,如果它没有在其他任何地方处理。 这是我为一个简单的 KeyDown 事件要做的事情。

      <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">
      

      【讨论】:

        【解决方案3】:

        最好的解决方案是使用前面建议的根元素,因为全局快捷方式使用应用于每个页面的一个类的功能,这意味着必须在每个页面上单独处理每个快捷方式,否则可能会出错。

        我的 XAML 设置如下:

        <Page
           Name="root"
            ...>
        
            ...
        
        </Page>
        

        我的 C# 操作那个页面是这样的:

        ... 
        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;
                 }
              }
        ...
        

        名称root 可通过打开该窗口时的任何按键访问,通过表达式root.KeyDown += Root_KeyDown。这会调用Root_KeyDown() 方法,然后该方法可以根据keypress 参数KeyRoutedEventArgs e 发送的键实现任何功能。

        我的代码实现了一个switch 语句来确定关键功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-05
          • 2012-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-21
          • 1970-01-01
          相关资源
          最近更新 更多