8

キーボードフォーカスを与えず に、コードでコンテナまたはフォーカスされた子の論理フォーカスを定義するにはどうすればよいですか?

コントロールがTabキーを使用するか、子に当たらないコンテナの一部をクリックしてフォーカスを取得するときに、どの子がフォーカスを取得するかを制御したいのですが、まだフォーカスがない場合は、実際のフォーカスを与えない(または盗む)ことはしません。それを持っている。

また、キーボードジェスチャを使用して特定の子を選択したり、マウスで子をクリックしたりすることも可能です。

キーボードフォーカスと論理フォーカスのWPFの違いを理解しています。また、要素の場合、キーボードフォーカスがあるということは論理フォーカスがあることを意味しますが、論理フォーカスがあるということは要素がキーボードフォーカスを持っているということではありません。

また、添付プロパティFocusManager.FocusedElementは、このプロパティを定義する要素から開始して、ビジュアルツリーで論理フォーカスを持つ要素を定義することも理解しています。

このプロパティは、FocusManager.IsFocusScopeがtrueに設定されている場合だけでなく、GroupBoxなどのコンテナーにも使用されることに気付きました。

私はWPFフォーカスのトピックについて多くの試み、大量の検索、および読書を行いましたが、これまでのところ成功していません。何が欠けているのか理解できません。

  • 呼び出しFocusManager.SetFocusedElementによってもキーボードフォーカスが与えられ、子要素のプロパティFocusableを直前にfalseに一時的に変更します。これは、子がフォーカスを取得した後ではなく、前にフォーカスがなかったときに初めて機能します。
  • 最初のフォーカスされた要素をオーバーライドするための要素またはコンテナでのイベントGotKeyboardFocusおよびPreviewGotKeyboardFocusの処理も機能しません。これは、フォーカスがマウスまたはキーボードのどちらから取得されたか、フォーカスが子要素に直接設定されたか、間接的に設定されたかがわからないためです。容器。
  • 私が達成しようとしていることを説明する例:RadioButtonの単純なグループがあり、ユーザーがフォーカスをこのGroupBoxに移動するときにどのオプションがフォーカスを取得するかをコードで動的に制御したい(通常はオプションありますisChecked=true)。

    <GroupBox Header="Options" Name="myGroupBox"
              KeyboardNavigation.TabNavigation="Once" 
              KeyboardNavigation. DirectionalNavigation="Cycle" >
        <StackPanel>
            <RadioButton GroupName="g1" Name="opt1" Content="Option _1"/>
            <RadioButton GroupName="g1" Name="opt2" Content="Option _2"/>
            <RadioButton GroupName="g1" Name="opt3" Content="Option _3"/>
        </StackPanel>
    </GroupBox>
    

    最後のコメントですが、 ListBoxを使用してオプションの動的リストを実装し、リストのselectedItemをデータコンテキストのプロパティにバインドし、ListBoxItemのスタイルとテンプレートを使用して、アイテムテンプレートのRadioButtonのIsCheckedプロパティをIsSelctedにバインドする方法を知っています。親のListBoxItemのプロパティであり、機能しますが、特定のケースでは、RadioButtonをデータコンテキストのプロパティに直接バインドする必要があります。同時にリストのIsSelectedプロパティにバインドすることはできません。

    4

    2 に答える 2

    1

    これは古い質問であることは承知していますが、この回答が同様の問題を抱えている他の人に役立つことを願っています。

    私が問題を正しく理解していれば、GroupBox で FocusManager.IsFocusScope="True" を設定することで目的の動作を実現でき、RadioButton.Checked イベントのイベント ハンドラーをフックして、論理フォーカスをイベントの送信者に設定できます。

    Xaml:

            <GroupBox Header="Options" Name="myGroupBox"
                  FocusManager.IsFocusScope="True"
                  RadioButton.Checked="MyGroupBox_OnChecked"
                  KeyboardNavigation.TabNavigation="Once" 
                  KeyboardNavigation.DirectionalNavigation="Cycle">
            <StackPanel>
                <RadioButton GroupName="g1" Name="opt1" Content="Option _1"/>
                <RadioButton GroupName="g1" Name="opt2" Content="Option _2"/>
                <RadioButton GroupName="g1" Name="opt3" Content="Option _3"/>
            </StackPanel>
        </GroupBox>
    

    コードビハインド:

        private void MyGroupBox_OnChecked(object sender, RoutedEventArgs e)
        {
            var radioB = sender as RadioButton;
            if (radioB != null)
                FocusManager.SetFocusedElement(myGroupBox, radioB);
        }
    
    于 2013-06-07T21:14:02.477 に答える