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
中にある場合には機能しません。TreeView
HierarchicalDataTemplate
繰り返しますが、これを単にアイテムを選択することと混同しないでください。aTreeViewItem
のIsSelected
プロパティを ViewModel にバインドするか、ビジュアル ツリーを手動でたどって必要TreeViewItem
な 「上」キーと「下」キーの機能を複製して、をナビゲートすることについて具体的に尋ねています。TreeView
たとえば、前の兄弟の子が展開されている場合に上に押すと、その兄弟の最後の子 (展開されている場合はその子の子など) に移動します。前の兄弟の子が折りたたまれている場合は、直接移動します。その兄弟に。追加のルールが表示されているか、有効になっている場合などがあります。
また、フォーカスをTreeViewItem
直接に明示的に設定して実行しようとしMoveFocus
ましたが、それもうまくいきませんでした。ディスパッチャーを介してそのロジックを呼び出して、フォーカスが実際に変更されたことを確認することさえ試みました。繰り返しますが、何もありません。
また、それ自体と aKeyboardNavigation.DirectionalNavigation
の両方でを試してみましたが、それでも何もしませんでした。TreeView
TreeViewItem
のようなことをしなければならない場合でもSendKeys
、それは役に立ちます。