2011-03-19 48 views
1

關注我想要的風格TabItem的‘焦點矩形’。我瞭解到我可以使用FocusVisualStyle來做到這一點。問題是FocusVisualStyle creates a sepearate visual tree for an adorner that is drawn on top of the control。我使用複雜的半透明控件和陰影效果,並且我需要顯示下的某個元素的一部分的矩形。繪製一個焦點矩形,只有當控制接收通過鍵盤

我在MSDN上發現,我可以使用IsKeyboardFocused combined with trigger實現我需要什麼。然而further research已顯示this is not correct,因爲:

鍵盤焦點是指當前正在接收鍵盤輸入的元素。這並不意味着焦點是通過鍵盤導航設置的。

其中一個可能的解決方法可能是:

你可以聽KEY_DOWN事件來檢查導航鍵是否被按下。 WPF控件在內部執行此操作以顯示FocusVisualStyle。

有沒有其他更簡單的方法來實現我想要做的?我並不是真的在創建代碼,監聽事件並處理所有這些許多不同的導航鍵和快捷鍵。

回答

1

默認情況下,FrameworkElement的檢查有什麼最後的輸入設備是一個覆蓋了OnGotKeyboardFocus。如果最後一個輸入設備是鍵盤,則顯示FocusVisualStyle。

您可以通過添加對GotKeyboardFocus事件的處理程序,並檢查是否InputManager.Current.MostRecentInputDevice is KeyboardDevice完成同樣的事情。

你可能會想添加一個附加的依賴屬性,所以你仍然可以使用一個觸發器,說IsFocusVisualVisible。如果最後一個輸入設備是鍵盤,則在GotKeyboardFocus處理程序中將其設置爲true,並在LostKeyboardFocus的處理程序中設置爲false。

+0

所以我仍然需要使用代碼'TabItem',對吧?除了使用代碼之外,還有其他方法嗎? – Paya 2011-03-20 18:09:42

+0

@Paja - 不幸的是,是的。您需要某種代碼隱藏來檢查MostRecentInputDevice屬性並掛接事件處理程序。 – CodeNaked 2011-03-20 19:45:53

+0

@Paja - 爲了澄清,你不需要在TabItem中「隱藏」代碼(即你不必創建派生類)。您可以使用[附加行爲](http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx)。 – CodeNaked 2011-03-20 20:12:49