2012-05-04 132 views
6

我如何在代碼中定義一個容器或專注子項的邏輯焦點,沒有給它鍵盤焦點?如何設置邏輯焦點而不提供鍵盤焦點?

我只想控制哪個孩子會獲得焦點,當控件通過Tab鍵獲得焦點或點擊未觸及孩子的部分容器時,如果它沒有給予(或竊取)實際焦點還沒有它。

我還希望通過鍵盤手勢選擇特定的孩子或用鼠標點擊它仍然是可能的。

我理解WPF在鍵盤焦點和邏輯焦點之間的區別,以及對於具有鍵盤焦點意味着也具有邏輯焦點但具有邏輯焦點的元素的事實並不意味着該元素具有鍵盤焦點。

我也理解附加屬性FocusManager.FocusedElement定義哪些元素在定義此屬性的元素開始的可視化樹中具有邏輯焦點。

我已經意識到,只有當FocusManager.IsFocusScope設置爲true時,纔會使用此屬性,但也適用於容器,如GroupBox

我做了很多嘗試,噸搜索和閱讀的WPF焦點話題,但沒有成功,到目前爲止,我不明白我失蹤:

  • 調用FocusManager.SetFocusedElement也給鍵盤焦點,它我之前暫時改變我的孩子元素設定爲假的屬性Focusable,它只能在第一次的時候沒有孩子收到關注,但不能完小孩後得到集中
  • 處理事件GotKeyboardFocusPreviewGotKeyboardFocus在元素或容器來覆蓋初始焦點元素也不起作用,因爲我不知道是否焦點是通過鼠標或鍵盤獲得的,焦點是直接設置爲子元素還是間接通過容器。
  • 一個例子來說明我想要實現的:我有一個簡單的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> 
    

    最後的評論,我知道如何在實施使用列表框選項的動態列表,該列表的將selectedItem綁定到數據上下文的屬性,然後通過樣式和模板ListBoxItem中綁定器isChecked 單選按鈕財產項目模板IsSelcted其父一個ListBoxItem財產,和它的作品,但我的具體情況,我需要ŧ o讓我的RadioButtons直接綁定到我的數據上下文的屬性,我不能將它們同時綁定到列表的IsSelected屬性。

    +0

    嘗試設置FocusManager.IsFocusScope = true對於GroupBox –

    +0

    偉大的問題,我正在尋找這個答案我自己... – Doug

    回答

    1

    我知道這是一個老問題,但希望這個答案能夠幫助其他類似問題的人。

    如果我正確理解問題,可以通過在GroupBox上設置FocusManager.IsFocusScope =「True」來實現所需的行爲,並掛接RadioButton.Checked事件的事件處理程序,以將Logical Focus設置爲發件人

    的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); 
        } 
    
    事件210
    +0

    正如OP所說,FocusManager.SetFocusedElement *有時*還提供了鍵盤焦點,而不僅僅是邏輯焦點。 http://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.setfocusedelement(v=vs.110).aspx「,並將嘗試給元素鍵盤焦點」。 –