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

StackOverflow https://stackoverflow.com/questions/820125

Вопрос

ItemsControl WPF отобразит прямоугольник фокуса, когда он считает, что у него есть фокус, и пользователь нажимает клавишу Tab или Alt.

Но недавно у меня ItemControl отображал прямоугольник фокуса, хотя у него не было фокуса - один из его родителей сделал это. 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, и, очевидно, я еще не знаю достаточно, иначе это не смутило бы меня. Два вопроса, которые помогут мне понять:

<Ол>
  • Почему ItemsControl отображает прямоугольник фокуса, когда он на самом деле не имеет фокуса, но один из его родительских элементов управления имеет? В чем причина этой функции? (Я уверен, что есть один - может быть, что-то связанное с шаблонами или визуальными деревьями? - Я просто еще недостаточно глубоко разбираюсь в механике и философии WPF.)
  • Как это работает? Какой механизм ItemsControl использует, чтобы решить, должен ли он отображать прямоугольник фокуса?
  • Это было полезно?

    Решение

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

    Другие советы

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top