Поделиться через


Стилизация фокуса в элементах управления и 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 или IsFocusWithin.

Как создать стиль визуального отображения фокуса

TargetType стиля, создаваемого для стиля визуального отображения фокуса, всегда должен быть Control. Стиль должен состоять в основном из ControlTemplate. В качестве конечного типа не следует указывать тип, имеющий стиль визуального отображения фокуса FocusVisualStyle.

Поскольку конечным типом всегда является Control, для настройки стиля необходимо использовать свойства, общие для всех элементов управления (свойства класса Control и его базовых классов). Следует создать шаблон, который будет правильно функционировать как наложение на элемент пользовательского интерфейса, и не будет скрывать функциональные области элемента управления. Как правило, это означает, что визуальная обратная связь должна отображаться за пределами полей элементов управления, как временный или малозаметный эффект, который не будет блокировать проверку попадания на элемент управления, для которого применен стиль визуального отображения фокуса. Свойства, которые можно использовать в шаблонной привязке, полезные для определения размеров и расположения шаблона наложения, включают ActualHeight, ActualWidth, Margin и Padding.

Альтернативное использование стиля визуального отображения фокуса

Для случаев, когда использование стиля визуального отображения фокуса не подходит по причине стилизации только отдельных элементов управления или потребности в более полном контроле над шаблоном элемента управления, существуют множество других доступных свойств и способов, позволяющих создавать визуальное поведение в ответ на изменения фокуса.

Триггеры, методы установки и методы установки события подробно обсуждаются в разделе Стилизация и использование шаблонов. Обработка маршрутизируемых событий обсуждается в разделе Общие сведения о перенаправленных событиях.

IsKeyboardFocused

При особенной заинтересованности в фокусе клавиатуры можно использовать свойство зависимости IsKeyboardFocused для свойства Trigger. Использование триггера в стиле или шаблоне более подходит для определения очень специфичного поведения фокуса клавиатуры для одного элемента управления, которое может визуально не совпадать с поведением фокуса клавиатуры для других элементов управления.

Другим похожим свойством зависимости является IsKeyboardFocusWithin, которое может быть подходящим для использования, если требуется визуально обнаружить фокус от клавиатуры где-либо внутри композиции или функциональной области элемента управления. Например, можно поместить триггер IsKeyboardFocusWithin, изменяющий внешний вид панели, которая группирует несколько элементов управления, даже когда фокус клавиатуры находится на отдельном элементе в пределах этой панели.

Также можно использовать события GotKeyboardFocus и LostKeyboardFocus (и их эквиваленты для предварительного просмотра). Эти события можно использовать в качестве основы для EventSetter либо можно написать обработчики событий в коде программной части.

Другие свойства фокуса

Если требуется, чтобы все возможные причины изменения фокуса порождали визуальное поведение, следует установить метод доступа или триггер на свойство зависимости IsFocused либо на события GotFocus или LostFocus, используемые для EventSetter.

См. также

Ссылки

FocusVisualStyle

Основные понятия

Стилизация и использование шаблонов

Общие сведения о фокусе

Общие сведения о входных данных

Другие ресурсы

Специальные возможности