1

当 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 使用什么机制来决定它应该显示一个焦点矩形?
4

2 回答 2

1

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

于 2009-05-28T19:26:46.157 回答
0

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

于 2009-05-26T22:17:50.100 回答