2017-01-20 20 views
0

私のウィンドウの "Up"キーを私のViewModelでコマンドを実行するように再バインドしたいとします。WPF:テキストボックスで飲み込まれないWindowにKeyBindingを持たせる方法

私のウィンドウには2つのコントロールListView、TextBoxがあります。

私は

<Window.InputBindings> 
    <KeyBinding Key="F5" Command={Binding SomeCommand} /> 
</Window.InputBindings> 

をすればすべてが正常に動作します。しかし、 "Up"または他の特定のキーに設定すると、TextBoxにフォーカスがある場合はコマンドが実行されません。これはTextBoxがこれらのキーを処理しており、コマンドをトリガーするイベントを飲み込んでいることを示しています。それを防止し、プレビューイベント(PreviewKeyUp)に似たウィンドウを表示する方法はありますか?あなたは、アプリケーションレベルのショートカットが必要な場合

答えて

0

、私は上記のロジックを取り、あなたがコマンドに/マップキーをバインドすることができます行動にそれを組み込むことをお勧めし

InputManager.Current.PreProcessInput += (sender,args) 
{ 
    var keyboardEvent = args?.StagingItem?.Input as KeyboardEventArgs; 

    if(keyboardEvent != null) 
    { 
     var keyArgs = keyboardEvent.RoutedEvent as KeyEventArgs; 

     if(keyArgs != null) 
     { 
      if(keyArgs.Key == Key.F5) 
      { 
       // Do something 
      } 
     }   
    } 
}; 

InputManager

を使用することができます。

+0

この設定では、私は手動でキーをマップし、 'commands [matchingCommandKey] .Execute(parameter)'のようなことをしましたか?私は 'InputManager'を使わずに今のところこれに似たものを手に入れました。私は単にウィンドウでPreviewKeyPressを使うだけですが、コマンドフレームワークを活用しようと考えていました。 – Kir

+0

はい。フォーカス/キャプチャの問題を避けるためにInputManagerを使用していました。アプリケーション全体をクロスカットしているようです。 – Eric

0

これを防止し、プレビューイベント(PreviewKeyUp)に似たウィンドウを表示する方法はありますか?

あなたは「handledEventsToo」ブール・パラメータを受け取り、このイベントハンドラからあなたのコマンドを呼び出すのAddHandlerメソッドのオーバーロードを使用してKeyDownEventにイベントハンドラをフックできます

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     var vm = new ViewModel(); 
     DataContext = vm; 
     AddHandler(KeyDownEvent, new KeyEventHandler((ss, ee) => 
     { 
      vm.SomeCommand.Execute(null); 
     }), true); 
    } 
} 

なしあり純粋なXAMLでこれを行う方法ですが、コマンドの呼び出しをビューのXAMLマークアップからまったく同じビューのコードビハインドクラスに移動するだけで、MVVMパターンに関する限り重要なことはありません。これはMVVMパターンを壊さない。

関連する問題