当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问题)来计算焦点矩形来自哪里,因为我从没想过没有焦点的控件显示焦点矩形。

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

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

解决方案

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top