5

どのコントロールにフォーカスがあるかに関係なく、キーボードショートカットをキャプチャするにはどうすればよいですか?私は、ユーザーが焦点を当てることができる可能性のあるコントロールごとに同じことを書きたくありません。では、ページ全体/コントロールに依存しないショートカットをどのように監視できますか?

4

3 に答える 3

4

このコードをコンストラクターに追加すると、グローバルキーダウンとキーが処理されます

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

このイベント内で独自のロジックを作成できます。

于 2013-02-07T13:46:40.143 に答える
1

ルート要素にイベントハンドラーを設定するのはどうですか?他の場所で処理されない場合、イベントは最終的に親コントロールに到達すると思います。これが、単純な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">
于 2013-02-07T12:47:16.887 に答える
0

グローバルショートカットはすべてのページに適用される1つのクラスの機能を使用するため、最善の解決策はルート要素を使用することでした。つまり、各ページで各ショートカットを個別に処理する必要があり、エラーが発生するリスクがあります。

私の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主要な機能を決定するステートメントを実装しています。

于 2017-12-06T03:01:41.310 に答える