Стилизация фокуса в элементах управления и FocusVisualStyle
Windows Presentation Foundation (WPF) предоставляет два параллельных механизма изменения внешнего вида элемента управления при получении фокуса клавиатуры. Первый механизм — использовать методы задания свойств для таких свойств, как IsKeyboardFocused в стиле или шаблоне, применяемом к элементу управления. Второй механизм — это предоставление отдельного стиля в качестве значения свойства FocusVisualStyle; "визуальный стиль фокуса" создает отдельное визуальное дерево для элемента, который отображается поверх элемента управления, вместо того чтобы изменять визуальное дерево самого элемента управления или другого элемента пользовательского интерфейса, заменяя его. В этом разделе рассматриваются сценарии, в которых подходят все эти механизмы.
Назначение визуального стиля фокуса
Функция визуального стиля фокуса предоставляет общую объектную модель для внедрения визуальной обратной связи пользователей на основе навигации по клавиатуре для любого элемента пользовательского интерфейса. Это возможно, не применяя новый шаблон к элементу управления или зная конкретную композицию шаблона.
Однако именно потому, что функция визуального стиля выделения работает без знания шаблонов элементов управления, визуальная обратная связь, которую можно отобразить для элемента управления с помощью визуального стиля выделения, поэтому ограничена. То, что на самом деле делает функция, заключается в наложении другого визуального дерева (декоратор) поверх визуального дерева, созданного отрисовкой элемента управления через его шаблон. Вы определяете это отдельное визуальное дерево с помощью стиля, который заполняет свойство FocusVisualStyle.
Поведение визуального стиля фокуса по умолчанию
Визуальные стили фокуса включаются только в том случае, если действие фокусировки было инициировано с клавиатуры. Любое действие мыши или изменение программного фокуса отключает визуальные стили фокуса. Дополнительные сведения о различиях между режимами фокусировки см. в разделе Обзор фокуса.
Темы элементов управления включают поведение визуального стиля фокуса по умолчанию, которое становится визуальным стилем фокуса для всех элементов управления в теме. Этот стиль темы определяется значением статического ключа FocusVisualStyleKey. При объявлении собственного визуального стиля фокуса на уровне приложения вы заменяете это поведение стиля по умолчанию из тем. Кроме того, если вы определяете всю тему, то этот же ключ следует использовать для определения стиля поведения по умолчанию для всей темы.
В темах визуальный стиль фокуса по умолчанию обычно очень прост. Ниже приведено грубое приближение:
<Style x:Key="{x:Static SystemParameters.FocusVisualStyleKey}">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle StrokeThickness="1"
Stroke="Black"
StrokeDashArray="1 2"
SnapsToDevicePixels="true"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Когда следует использовать визуальные стили фокуса
Концептуально внешний вид визуальных стилей фокуса, применяемых к элементам управления, должен быть согласован между всеми элементами управления. Одним из способов обеспечения согласованности является изменение визуального стиля фокуса только в том случае, если вы разрабатываете целую тему. В этой теме каждый элемент управления, определённый в ней, получает либо тот же самый визуальный стиль фокуса, либо некоторую вариацию стиля, который визуально связан от элемента управления к элементу управления. Кроме того, вы можете использовать один и тот же стиль (или аналогичные стили) для стиля каждого элемента с фокусом клавиатуры на странице или в пользовательском интерфейсе.
Настройка FocusVisualStyle для отдельных стилей управления, которые не входят в состав темы, не предусмотрена для использования стилей фокусировки визуального оформления. Это связано с тем, что несогласованное визуальное поведение между элементами управления может привести к запутанности пользовательского взаимодействия с фокусом клавиатуры. Если вы намереваетесь определить специфические для управления поведения фокуса клавиатуры, которые намеренно не согласованы в рамках темы, гораздо лучше использовать триггеры в стилях для отдельных свойств состояния ввода, таких как IsFocused или IsKeyboardFocused.
Визуальные стили применяются исключительно для клавиатурного фокуса. Таким образом, визуальные стили фокуса являются типом функции доступности. Если вы хотите изменить пользовательский интерфейс для любого типа фокуса, будь то с помощью мыши, клавиатуры или программно, не следует использовать визуальные стили фокуса, а вместо этого следует использовать методы задания и триггеры в стилях или шаблонах, работающих со значением общих свойств фокуса, таких как IsFocused или IsKeyboardFocusWithin.
Создание визуального стиля фокусировки
Стиль, создаваемый для визуального оформления фокуса, всегда должен включать TargetType из Control. Стиль должен состоять главным образом из ControlTemplate. Вы не указываете целевой тип для типа, к которому применяется визуальный стиль фокуса FocusVisualStyle.
Так как целевой тип всегда Control, необходимо оформлять, используя свойства, общие для всех элементов управления (используя свойства класса Control и его базовые классы). Необходимо создать шаблон, который будет правильно функционировать как наложение на элемент пользовательского интерфейса, и это не будет скрывать функциональные области элемента управления. Как правило, это означает, что визуальная обратная связь должна отображаться вне границ элементов управления или как временные или ненавязчивые эффекты, которые не блокируют определение попадания на элемент управления, где применяется визуальный стиль фокуса. Свойства, которые можно использовать в привязке шаблона, которые полезны для определения размера и размещения шаблона наложения, включают ActualHeight, ActualWidth, Marginи Padding.
Альтернативные варианты использования визуального стиля фокуса
В ситуациях, когда использование визуального стиля фокуса не подходит, либо из-за того, что вы используете только стили отдельных элементов управления, либо потому что требуется более широкий контроль над шаблоном элемента управления, существует множество других доступных свойств и методов, которые могут создавать визуальное поведение в ответ на изменения в фокусе.
Триггеры, установщики и установщики событий подробно рассматриваются в "Стили и Шаблоны". Обработка маршрутизируемых событий обсуждается в Обзоре маршрутизируемых событий.
IsKeyboardFocused
Если вы специально заинтересованы в фокусе клавиатуры, свойство зависимости IsKeyboardFocused можно использовать для свойства Trigger. Триггер свойства в стиле или шаблоне является более подходящим способом определения поведения фокуса клавиатуры, специально предназначенного для одного элемента управления, и который может визуально не соответствовать поведению фокуса клавиатуры для других элементов управления.
Другое аналогичное свойство зависимостей — это IsKeyboardFocusWithin, которое может быть уместно использовать, если вы хотите визуально выделить, что фокус клавиатуры находится в пределах составной или функциональной области элемента управления. Например, можно поместить триггер IsKeyboardFocusWithin таким образом, чтобы панель, которая группирует несколько элементов управления, отображалась по-разному, даже если фокус клавиатуры может быть более точным на отдельном элементе на этой панели.
Вы также можете использовать события GotKeyboardFocus и LostKeyboardFocus (а также их эквиваленты предварительной версии). Эти события можно использовать в качестве основы для EventSetterили писать обработчики для событий в коде за кулисами.
Другие свойства фокуса
Если вы хотите, чтобы все возможные причины изменения фокуса вызывали визуальное поведение, следует основать установщик или триггер на свойстве зависимости IsFocused, или альтернативно на событиях GotFocus или LostFocus, использованных для EventSetter.
См. также
.NET Desktop feedback