2011-03-19 42 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