0

TreeView「上」および「下」矢印キーが分離コードからナビゲートする方法をプログラムで模倣しようとしています。(注: 単に項目を選択するのではなく、矢印キー ナビゲーションを模倣します。)

具体的には、私たちのユースケースは の の 1 つでTreeViewありHierarchicalDataTemplatesTextBoxもちろん、フォーカス時にすべてのキーボード アクティビティを盗みます。しかし、これは単一行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は、 がの中にある場合にはうまく機能しますが、ListBoxDataTemplate中にある場合には機能しません。TreeViewHierarchicalDataTemplate

繰り返しますが、これを単にアイテムを選択することと混同しないでください。aTreeViewItemIsSelectedプロパティを ViewModel にバインドするか、ビジュアル ツリーを手動でたどって必要TreeViewItemな 「上」キーと「下」キーの機能を複製して、をナビゲートすることについて具体的に尋ねています。TreeView

たとえば、前の兄弟の子が展開されている場合に上に押すと、その兄弟の最後の子 (展開されている場合はその子の子など) に移動します。前の兄弟の子が折りたたまれている場合は、直接移動します。その兄弟に。追加のルールが表示されているか、有効になっている場合などがあります。

また、フォーカスをTreeViewItem直接に明示的に設定して実行しようとしMoveFocusましたが、それもうまくいきませんでした。ディスパッチャーを介してそのロジックを呼び出して、フォーカスが実際に変更されたことを確認することさえ試みました。繰り返しますが、何もありません。

また、それ自体と aKeyboardNavigation.DirectionalNavigationの両方でを試してみましたが、それでも何もしませんでした。TreeViewTreeViewItem

のようなことをしなければならない場合でもSendKeys、それは役に立ちます。

4

2 に答える 2

1

可能な方法の 1 つは、Avalon Control LibraryのTreeListBox実装、またはこれに類似したもの (たとえば、独自のもの) を使用することです。おっしゃるとおりListBox にも応用できるので、 ListBoxから直接派生したTreeListBoxにも応用しやすいと思います。

于 2012-05-10T05:03:22.990 に答える
1

WPF UI オートメーション フレームワークには、おそらくそれを行う方法があります。しかし、それがうまくいかない場合、このプロジェクトはそれを行うために何かをコーディングしました:

http://wpfsendkeys.codeplex.com/

于 2012-05-10T16:31:03.467 に答える