Фокус ввода

58

В мире Windows пользователь может работать в любой момент времени лишь с одним элементом управления. Элемент, который в данный момент получает нажатия клавиши пользователем, имеет фокус ввода. Иногда такой элемент выглядит немного по-другому. Например, кнопка WPF, имеющая фокус, приобретает синий оттенок.

Чтобы элемент управления мог получать фокус, его свойство Focusable должно иметь значение true. По умолчанию это так для всех элементов управления. Интересно, что свойство Focusable определено как часть класса UIElement: это означает, что остальные элементы, не являющиеся элементами управления, тоже могут получать фокус. Обычно в классах, не являющихся элементами управления, свойство Focusable по умолчанию имеет значение false. Но ему можно присвоить значение true. Попробуйте сделать это на примере контейнера компоновки наподобие StackPanel: когда он получит фокус, вокруг панели появится пунктирная рамка.

Чтобы переместить фокус с одного элемента на другой, пользователь может щелкнуть кнопкой мыши или воспользоваться клавишей <Tab> и клавишами управления курсором. В предыдущих средах разработки программисты прилагали много усилий, чтобы клавиша <Tab> передавала фокус понятным образом (обычно слева направо, а затем сверху вниз в окне), и чтобы при первом отображении окна фокус передавался нужному элементу управления. В WPF такая дополнительная работа требуется очень редко, т.к. тут для реализации последовательности переходов используется иерархическая компоновка элементов.

По сути, при нажатии клавиши <Tab> происходит переход к первому потомку в текущем элементе или, если текущий элемент не имеет (больше) потомков, к следующему элементу на том же уровне. Например, серия нажатий клавиши табуляции в окне, в котором имеются два контейнера StackPanel, перебирает все элементы управления в первом контейнере StackPanel, а затем все элементы управления во втором.

Если необходимо управлять последовательностью переходов, можно задать свойство TabIndex каждого элемента управления, чтобы пронумеровать их в нужном порядке. Элемент с нулевым значением свойства TabIndex получает фокус первым, а затем — элементы с большим значением этого свойства (например, 1, 2, 3 и т.д.). При наличии нескольких элементов с одинаковыми значениями TabIndex WPF выполняет автоматическую передачу фокуса, когда фокус получает ближайший элемент в последовательности.

По умолчанию свойство TabIndex во всех элементах управления имеет значение Int32.MaxValue. Это означает, что можно назначить определенный элемент в качестве стартовой точки в окне, присвоив его свойству TabIndex значение 0. Для остальных элементов в окне остается автоматическая навигация, и пользователь будет переходить по ним от данной стартовой точки в порядке определения этих элементов.

Свойство TabIndex определено в классе Control, там же, где и IsTabStop. Свойству IsTabStop можно присвоить значение false, чтобы исключить элемент управления из последовательности переходов. Различие между IsTabStop и Focusable заключается в том, что элемент управления со свойством IsTabStop, равным false, может получить фокус другим путем — либо программно (когда в коде вызывается метод Focus ()), либо при щелчке кнопкой мыши.

Элементы управления, являющиеся невидимыми или заблокированными (затенены) обычно не включаются в последовательность переходов и не активизируются, независимо от значений свойств TabIndex, IsTabStop и Focusable. Чтобы скрыть или заблокировать элемент управления, используются свойства Visibility и IsEnabled, соответственно.

Пройди тесты
Лучший чат для C# программистов