鍵盤焦點和邏輯焦點(Logic Focus與Keyboard Focus )post
1.定義
Keyboard Focus能夠理解爲物理焦點。就是整個桌面上能夠響應鍵盤輸入的地方,整個桌面在某個時刻只可能有一個地方能接受鍵盤的輸入,所以整個桌面在某個時刻只可能有一個Keyboard Focus.spa
Logic Focus從字面上理解是邏輯焦點。通常帶「邏輯」字眼的東西都有多是「虛」的,在這裏也不例外。
Logic Focus並非真正的焦點。它只是在桌面上某個範圍內,在該範圍未得到物理焦點以前,該範圍默認的在該範圍以內的「焦點」,當該範圍得到物理焦點時,會首先將物理焦點分配給邏輯焦點所在的地方。這個「範圍」稱做Focus Scope. 在WPF中默認被設置成的Focus Scope有 Window, MenuItem, ToolBar, and ContextMenu。也能夠手動設置某個控件成爲Focus Scope(經過設置FocusManager.IsFocusScope附加屬性或調用FocusManager.SetFocusScope方法)。和Keyboard Focus對應,每個Focus Scope內只有一個Logic Focus.對象
綜上所述Keyboard Focus與Logic Focus不是任什麼時候候都相等,Keyboard Focus只和同一個Focus Scope內的Logic Focus相等。理論上Logic Focus好像並無什麼實際意義。
2.API
WPF中提供Keyboard類和FocusManager類來分別管理Keyboard Focus和Logic Focus.經過這個兩個類能夠Set和Get相應類型的Focus(FocusManager還能夠Set和Get Focus Scope)以及提供相應類型Event.
3. Focus的改變
1)用戶的操做會改變Keyboard Focus,同時也會改變同一個Focus Scope內的Logic Focus。
2)經過Keyboard和FocusManager中提供的API能夠改變相應類型的Focus。
3)經過控件的Focus方法能夠改變Focus Scope內的Logic Focus,若是Keyboard Focus也在此Focus Scope中則同時也會改變Keyboard Focus.
4)經過控件的MoveFocus方法能夠改變Keyboard Focus(調用該方法時須要傳遞一個TraversalRequest來指示移動的方向,TraversalRequest中包含指示移動方向的FocusNavigationDirection 枚舉對象)blog
在WPF中,有兩種焦點:鍵盤焦點和邏輯焦點。get
若是一個控件得到了鍵盤焦點,那麼該控件就是當前能夠得到鍵盤輸入的控件。每一個程序只能有一個控件能得到鍵盤焦點。io
若是一個控件得到了邏輯焦點,那麼說明該控件得到了當前焦點域(focus scope )內的邏輯焦點。WPF會記錄一組或多組控件,每一個組被看作是一個焦點域(focus scope )。在每一個焦點域內只有一個控件能夠得到邏輯焦點。邏輯焦點幫助WPF記住每一個組中上一次得到焦點的控件,並在這個組從新變爲得到焦點的時候,將鍵盤焦點返回給組中合適的控件。class
得到鍵盤焦點的控件必定得到了邏輯焦點,得到了邏輯焦點的控件不必定得到了鍵盤焦點。sed
關於焦點域(focus scope )能夠舉個例子:好比一個Panel裏面有若干個CheckBox,這些CheckBox能夠認爲構成了一個焦點域,當鼠標選中某個CheckBox的時候,這個CheckBox得到了鍵盤焦點和邏輯焦點。當鼠標移出這個Panel而且選中了外面的某個能夠得到鍵盤焦點的控件的時候,以前得到鍵盤焦點的CheckBox就失去了鍵盤焦點,可是仍然保留着邏輯焦點。能夠理解爲WPF記住了這個組中,上一次得到鍵盤焦點的是這個CheckBox。若是再次將鼠標移動到Panel裏面,並使Panel得到焦點(不點擊任何CheckBox),那麼這個時候當前組中得到邏輯焦點的CheckBox會再次得到鍵盤輸入焦點。命名空間
你可使用Keyboard.Focus 靜態方法設置控件得到鍵盤焦點,使用FocusManager.SetFocusedElement 靜態方法使控件得到邏輯焦點。(System.Windows.Input 命名空間中)rsa
固然,你也可使用控件自身(UIElement )的Focus 方法給控件自身設置焦點。它和Keyboard.Focus 靜態方法的區別是:Keyboard.Focus 靜態方法僅僅只設置鍵盤焦點。而UIElement 的Focus 方法會嘗試將鍵盤焦點設置給控件,若是控件獲取鍵盤焦點失敗,則將邏輯焦點設置給控件。
注:原文地址:https://wpf.2000things.com/2011/05/27/309-keyboard-focus-vs-logical-focus/