スクロールビュー内にキャンバスがあります。スクロールビューにキーダウンイベントハンドラーをアタッチしました。ほとんどのキーでは、ハンドラーが呼び出されます。
ただし、矢印キーの場合、ハンドラーは呼び出されません。代わりに、scrollviewは適切な方向にスクロールされます。
また、スクロールビューにキーアップハンドラーをアタッチしましたが、キーアップは矢印キーに対して呼び出されます。
ここで矢印キーダウンイベントを取得する方法はありますか?
スクロールビュー内にキャンバスがあります。スクロールビューにキーダウンイベントハンドラーをアタッチしました。ほとんどのキーでは、ハンドラーが呼び出されます。
ただし、矢印キーの場合、ハンドラーは呼び出されません。代わりに、scrollviewは適切な方向にスクロールされます。
また、スクロールビューにキーアップハンドラーをアタッチしましたが、キーアップは矢印キーに対して呼び出されます。
ここで矢印キーダウンイベントを取得する方法はありますか?
KeyUpイベントを使用するだけです。チャームのように機能します。
このばかげたハックを見つけて、それを機能させました。スクロールビューをタブストップに設定しないと、主要なイベントが食べられなくなります。そこで、目に見えないテキストボックスにフォーカスを当てることでそれを修正しました。
scrollView.IsTabStop = false;
invisibleTextBox.Foreground = new SolidColorBrush(Colors.Transparent);
invisibleTextBox.Background = new SolidColorBrush(Colors.Transparent);
Canvas.SetZIndex(invisibleTextBox, -1000);
invisibleTextBox.KeyDown += new KeyEventHandler(HandleKeyDown);
invisibleTextBox.KeyUp += new KeyEventHandler(HandleKeyUp);
編集:テキストボックスをキャンバスから移動する必要がありました。これは、非表示であるにもかかわらず、アウトラインがまだ表示されているためです。
2 番目の編集: KeyDown イベントをキャプチャできることが最初にわかったので、テキスト ボックスを使用しました。ただし、UserControl は可能です。そのため、非表示のテキスト ボックスの代わりに UserControl を使用する方がよいでしょう。必要に応じて、UserControl で Focus() を呼び出すことができます。
これは可能な答えです - 私はこれをテストする機会がありませんでした. ただし、コントロールがイベントに到達する前にイベントを消費している場合、過去に同様の問題がありました。あなたが試すことができるかもしれないいくつかのことがあります:
1) を除いて、これらはすべてハックと見なされますが、幸運を祈ります。
「PreviewKeyDown イベントを使用してください。それが呼ばれるものだと思います。コントロールによって消費される前に、イベントに到達できる可能性があります。」
これは機能します。イベント引数を「Handled = true」に設定するだけで、ScrollViewer (または ListBox) は、イベントを処理した後にイベントを取得しません。ただし、ListBox に IsTabStop プロパティを使用する必要はありませんでした。とにかく何もしなかったようです。