Почему ItemsControl показывает прямоугольник фокуса, когда его родительский элемент находится в фокусе?

ItemsControl WPF будет отображать прямоугольник фокуса, когда он думает, что он имеет фокус, и пользователь нажимает 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, чтобы решить, что он должен отображать прямоугольник фокуса?

person Joe White    schedule 04.05.2009    source источник


Ответы (2)


Вы уверены, что у ItemsControl нет фокуса? Если он рисует прямоугольник фокуса, он должен. Тот факт, что элемент управления, расположенный выше в визуальном дереве, сфокусирован, не означает, что один из его дочерних элементов также не сфокусирован. Чтобы понять, почему, убедитесь, что вы узнали разницу между «логическим фокусом» и «фокусом клавиатуры» в WPF. На MSDN есть исчерпывающее объяснение.

person PeterAllenWebb    schedule 28.05.2009

Я думаю, это сделано намеренно. Насколько я понимаю, фокус наследуется от родительского элемента управления и движется вниз по визуальному дереву. Попробуйте изучить визуальный стиль родительского элемента itemscontrol, а затем самого элемента управления, чтобы увидеть, что происходит с визуальным деревом xaml. Это должно дать некоторые подсказки относительно того, что происходит. Также вы можете попробовать поискать в Google и на некоторых других сайтах информацию о фокусе и элементах управления и т. Д. Там может быть какая-то другая информация, которая дает более подробную информацию о том, как все это работает, более ясную, чем то, как я могу ее объяснить. Что произойдет, если вы щелкните элемент управления элементами, а затем щелкните в другом месте, а затем щелкните родительский элемент? Какие-нибудь изменения в фокусе? Вы также можете попробовать создать собственный класс, который переопределяет фокус и делает так, чтобы элемент управления не отображал фокус таким же образом. Это должно быть (довольно) легко сделать. Информация об этом может быть на определенных сайтах / блогах.

person Community    schedule 26.05.2009