鍵盤焦點和邏輯焦點(Logic Focus與Keyboard Focus )


鍵盤焦點和邏輯焦點(Logic Focus與Keyboard Focus )

1.定義
Keyboard Focus可以理解為物理焦點。就是整個桌面上可以響應鍵盤輸入的地方,整個桌面在某個時刻只可能有一個地方能接受鍵盤的輸入,因此整個桌面在某個時刻只可能有一個Keyboard Focus.

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 枚舉對象)

在WPF中,有兩種焦點:鍵盤焦點和邏輯焦點。

如果一個控件獲得了鍵盤焦點,那么該控件就是當前可以獲得鍵盤輸入的控件。每個程序只能有一個控件能獲得鍵盤焦點。

如果一個控件獲得了邏輯焦點,那么說明該控件獲得了當前焦點域(focus scope )內的邏輯焦點。WPF會記錄一組或多組控件,每個組被看做是一個焦點域(focus scope )。在每個焦點域內只有一個控件可以獲得邏輯焦點。邏輯焦點幫助WPF記住每個組中上一次獲得焦點的控件,並在這個組重新變為獲得焦點的時候,將鍵盤焦點返回給組中合適的控件。

獲得鍵盤焦點的控件一定獲得了邏輯焦點,獲得了邏輯焦點的控件不一定獲得了鍵盤焦點。

關於焦點域(focus scope )可以舉個例子:比如一個Panel里面有若干個CheckBox,這些CheckBox可以認為構成了一個焦點域,當鼠標選中某個CheckBox的時候,這個CheckBox獲得了鍵盤焦點和邏輯焦點。當鼠標移出這個Panel並且選中了外面的某個可以獲得鍵盤焦點的控件的時候,之前獲得鍵盤焦點的CheckBox就失去了鍵盤焦點,但是仍然保留着邏輯焦點。可以理解為WPF記住了這個組中,上一次獲得鍵盤焦點的是這個CheckBox。如果再次將鼠標移動到Panel里面,並使Panel獲得焦點(不點擊任何CheckBox),那么這個時候當前組中獲得邏輯焦點的CheckBox會再次獲得鍵盤輸入焦點。

你可以使用Keyboard.Focus 靜態方法設置控件獲得鍵盤焦點,使用FocusManager.SetFocusedElement 靜態方法使控件獲得邏輯焦點。(System.Windows.Input 命名空間中)

當然,你也可以使用控件自身(UIElement )的Focus 方法給控件自身設置焦點。它和Keyboard.Focus 靜態方法的區別是:Keyboard.Focus 靜態方法僅僅只設置鍵盤焦點。而UIElementFocus 方法會嘗試將鍵盤焦點設置給控件,如果控件獲取鍵盤焦點失敗,則將邏輯焦點設置給控件。

注:原文地址https://wpf.2000things.com/2011/05/27/309-keyboard-focus-vs-logical-focus/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM