2017-11-23 10 views
0

奇妙なWPFのコンボボックスの動作:奇妙なキーボードフォーカスイベントのため

私はちょうどキーボード・フォーカスが(前のコントロールからフォーカスをタブ移動)tabキーを経由して設定されているWPF ComboBox、中にいることに気づいた、とComboBox内部TextBox ( "PART_EditableTextBox")は、トンネリングイベントOnPreviewGotKeyboardFocusのソースです。

しかし、いくつかの奇妙な理由から、コントロール内でマウスをクリックしてフォーカスを受け取った場合、OnPreviewGotKeyboardFocusが2回呼び出されます。ソースはComboBoxです。もう一度、ソースは、PART_EditableTextBoxです。

また、ComboBoxでFocusable to Falseを設定しても、Tabキーを使用してフォーカスすることはできますが、マウスは使用できません。

誰が、なぜこの奇妙な振る舞いを知っていますか?マイクロソフトのドキュメントから

答えて

1

KeyboardNavigationクラスは、ナビゲーションキーの1つが押されたときに、デフォルトのキーボードフォーカスナビゲーションを実装します。ナビゲーションキーは以下のとおりです。TAB、SHIFT + TAB、CTRL + TAB、CTRL + SHIFT + TABの、UPARROW、DOWNARROW、LEFTARROW、およびRIGHTARROWキー。

ナビゲーションコンテナーのナビゲーション動作は、添付のKeyboardNavigationプロパティTabNavigation、 ControlTabNavigation、DirectionalNavigationを設定することによって変更することができます。これらのプロパティは、型KeyboardNavigationModeの であり、可能な値は、一度、 ローカル、含まれる、サイクルを継続していない、となしています。デフォルト値は Continueです。つまり、要素はナビゲーションコンテナではありません。

コンボボックス自体は、ナビゲーションコンテナです。これは、タブを押すと、PART_EditableTextBoxのコンテナがKeyBoardNavigationModeがデフォルトで続行するように設定している(これはフォーカスが最初の非コンテナ要素に直接移動することを意味します)ことを意味します。代わりにclickイベントはキーボードキーを押さないため、この動作はオーバーライドされ、イベントはWPFがビジュアルツリーで見つけるすべての要素によって順番に起動されます。これは、フォーカスがテキストボックスに達する前に、コントロールで操作を行うためにこのイベントを処理できることを保証するために行われます。また、WPFがあなたが何をクリックしようとしているのかを正確に知ることができないため、これが必要であると考える必要があります。そのため、コンボボックスの各レイヤーから同じイベントを順番に呼び出す必要があります(エクスパンダをクリックすると、フォーカスはPART_EditableTextBox内で停止しません)。

要するに、Tabキーを押す場合、デフォルトでWPFはコンボボックス内のテキストボックスであることを知っています。そのため、コンボボックス自体でイベントを発生させる必要はありません。一方、コンボボックスをクリックすると、最後にどの要素がフォーカスされているのか、そしてフォーカスを切り替える前に何らかの操作が行われているかどうかを確認する必要があります。

最後にFocusableプロパティについては、コントロール用のこのコントロールは、コントロールがフォーカスを受け取ることができるかどうかを示します。つまり、ユーザーがコントロールをクリックした後にコントロールがキーボード入力を受け取ることができます。 Focusableは通常、ユーザーの入力を受け入れるように設計されたコントロールではtrueに設定されます。キーボードフォーカスを受け取ることができる部分は、テキストボックスです。だから、Focusable = falseをコンボボックス内に設定すると、KeyboardNavigationクラスはTextboxではなくComboboxにフォーカスを置きます。デフォルトの動作を適用できないからです。

+0

詳細な返信をありがとうございます。私はそれがまだ私には意味がないと言わなければならないが、少なくとも私はそれの背後にある論理を知っている。 – user884248