TreeView「上」および「下」矢印キーが分離コードからナビゲートする方法をプログラムで模倣しようとしています。(注: 単に項目を選択するのではなく、矢印キー ナビゲーションを模倣します。)
具体的には、私たちのユースケースは の の 1 つでTreeViewありHierarchicalDataTemplates、TextBoxもちろん、フォーカス時にすべてのキーボード アクティビティを盗みます。しかし、これは単一行TextBoxであるため、基本的に「上」キーと「下」キーを無視し、代わりにそれらを基TreeViewになるものに渡してそこで処理するようにしたいと考えています。
これを行うために、 をサブクラス化し、次のようにオーバーライドTextBoxで「上」キーと「下」キーをインターセプトしています...OnPreviewKeyDown
protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
{
switch(e.Key)
{
case Key.Up:
case Key.Down:
// Swallow the key
e.Handled = true;
// Get the navigation direction
var direction = (e.Key == Key.Up)
? FocusNavigationDirection.Up
: FocusNavigationDirection.Down;
// Perform the navigation
MoveFocus(new TraversalRequest(direction));
break;
default:
base.OnPreviewKeyDown(e);
break;
}
}
この手法TextBoxは、 がの中にある場合にはうまく機能しますが、ListBoxのDataTemplate中にある場合には機能しません。TreeViewHierarchicalDataTemplate
繰り返しますが、これを単にアイテムを選択することと混同しないでください。aTreeViewItemのIsSelectedプロパティを ViewModel にバインドするか、ビジュアル ツリーを手動でたどって必要TreeViewItemな 「上」キーと「下」キーの機能を複製して、をナビゲートすることについて具体的に尋ねています。TreeView
たとえば、前の兄弟の子が展開されている場合に上に押すと、その兄弟の最後の子 (展開されている場合はその子の子など) に移動します。前の兄弟の子が折りたたまれている場合は、直接移動します。その兄弟に。追加のルールが表示されているか、有効になっている場合などがあります。
また、フォーカスをTreeViewItem直接に明示的に設定して実行しようとしMoveFocusましたが、それもうまくいきませんでした。ディスパッチャーを介してそのロジックを呼び出して、フォーカスが実際に変更されたことを確認することさえ試みました。繰り返しますが、何もありません。
また、それ自体と aKeyboardNavigation.DirectionalNavigationの両方でを試してみましたが、それでも何もしませんでした。TreeViewTreeViewItem
のようなことをしなければならない場合でもSendKeys、それは役に立ちます。