Почему ItemsControl показывает прямоугольник фокуса, когда его родитель фокусируется? - PullRequest
1 голос
/ 04 мая 2009

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

Ответы [ 2 ]

1 голос
/ 28 мая 2009

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

0 голосов
/ 27 мая 2009

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

...