为什么ItemsControl在其父对象聚焦时显示焦点矩形?

时间:2009-05-04 13:35:21

标签: wpf focus itemscontrol focusvisualstyle

当WPF的ItemsControl认为它具有焦点并且用户按下Tab或Alt时,它将显示焦点矩形。

但是我最近有一个ItemsControl显示一个焦点矩形,即使它没有焦点 - 其中一个父母做了。 ItemsControl位于UserControl中,该控件位于另一个 具有焦点的UserControl中。像这样:

<!-- UserControl1.xaml; this is the control that has focus -->
<UserControl x:Class="UserControl1" Focusable="True" ...>
    <UserControl2/>
</UserControl>

<!-- UserControl2.xaml -->
<UserControl x:Class="UserControl2">
    <ItemsControl .../>
</UserControl>

或者,以视觉方式显示嵌套:

+---------------------------------------------------+
| UserControl1 (has focus)                          |
|                                                   |
| +-----------------------------------------------+ |
| | UserControl2                                  | |
| |                                               | |
| | +-------------------------------------------+ | |
| | | ItemsControl (shows focus rectangle)      | | |

我花了一段时间(和StackOverflow question)来确定焦点矩形的来源,因为我从没想过没有焦点的控件可以显示焦点矩形。

我还在学习WPF的方法,显然我还不知道,或者这不会让我感到困惑。两个问题可以帮助我理解:

  1. 为什么当ItemsControl实际上没有焦点时,它会显示一个焦点矩形,但它的一个父控件呢?这个功能的原因是什么? (我确定有一个 - 也许与模板或视觉树有关? - 我对WPF机制和哲学还没有足够的了解。)
  2. 如何运作? ItemsControl用来决定它应该显示焦点矩形的机制是什么?

2 个答案:

答案 0 :(得分:1)

您确定ItemsControl没有焦点吗?如果它正在绘制焦点矩形,它应该。仅仅因为视觉树中较高的控件是聚焦的,并不意味着它的一个孩子也没有集中注意力。要了解原因,请确保您已经了解了WPF中“逻辑焦点”和“键盘焦点”之间的区别。 MSDN上有一个exaustive explanation

答案 1 :(得分:0)

我认为这是设计上的。我的理解是焦点从父控件继承而来,沿着可视树工作。尝试检查itemscontrol父级的视觉样式,然后检查itemscontrol本身,以查看xaml的可视树正在进行的操作。这应该揭示一些正在发生的事情的线索。此外,您可以尝试搜索谷歌和其他一些网站上的焦点和项目控制等信息。可能还有一些其他信息提供了更多详细信息,说明所有工作的方式比我能解释的更清楚。如果单击itemscontrol然后单击其他位置然后单击父项,会发生什么?焦点有什么变化吗?您还可以尝试创建一个覆盖焦点的自定义类,并使其成为控件不会以相同的方式显示焦点。应该(相当)容易做到。某些网站/博客上可能有相关信息。