FocusVisualStyle et application d'un style au focus dans les contrôles

Mise à jour : novembre 2007

Windows Presentation Foundation (WPF) propose deux mécanismes parallèles permettant de modifier l'apparence visuelle d'un contrôle lorsqu'il reçoit le focus clavier. Le premier mécanisme consiste à utiliser des accesseurs Set de propriété pour des propriétés telles que IsKeyboardFocused dans le style ou le modèle appliqué au contrôle. Le deuxième mécanisme consiste à fournir un style distinct comme valeur de la propriété FocusVisualStyle ; le "style de focus visuel" crée une arborescence d'éléments visuels distincte pour un ornement qui est dessiné sur le contrôle, au lieu de modifier l'arborescence d'éléments visuels du contrôle ou d'un autre élément de l'interface utilisateur de contrôle en le remplaçant. Cette rubrique décrit les scénarios où chacun de ces mécanismes est approprié.

Cette rubrique comprend les sections suivantes.

  • Finalité du style de focus visuel
  • Comportement par défaut du style de focus visuel
  • Quand utiliser des styles de focus visuels
  • Comment créer un style de focus visuel
  • Alternatives à l'utilisation d'un style de focus visuel
  • Rubriques connexes

Finalité du style de focus visuel

La fonction du style de focus visuel fournit un "modèle objet" commun pour l'introduction d'une rétroaction visuelle de l'utilisateur dans la navigation à partir du clavier dans tout élément de l'interface utilisateur. Cela est possible sans appliquer un nouveau modèle au contrôle ou sans connaître la composition spécifique du modèle.

Toutefois, précisément du fait que la fonction du style de focus visuel s'exécute sans connaître les modèles de contrôle, la rétroaction visuelle qui peut être affichée pour un contrôle à l'aide d'un style de focus visuel est forcément limitée. En fait, cette fonction superpose une arborescence d'éléments visuels différente (un ornement) sur l'arborescence d'éléments visuels créée par le rendu d'un contrôle à travers son modèle. Vous définissez cette arborescence d'éléments visuels distincte à l'aide d'un style qui renseigne la propriété FocusVisualStyle.

Comportement par défaut du style de focus visuel

Les styles de focus visuels agissent uniquement lorsque l'action du focus a été initiée par le clavier. Toute action de la souris ou toute modification de focus par programmation désactive le mode des styles de focus visuels. Pour plus d'informations sur les distinctions entre les modes de focus, consultez Vue d'ensemble du focus.

Les thèmes relatifs aux contrôles comprennent un comportement de style de focus visuel par défaut qui s'applique à tous les contrôles contenus dans le thème. Ce style de thème est identifié par la valeur de la clé statique FocusVisualStyleKey. Lorsque vous déclarez votre propre style de focus visuel au niveau d'une application, vous remplacez ce comportement de style par défaut à partir des thèmes. Ou bien, si vous définissez le thème entier, vous devez alors utiliser cette même clé pour définir le style du comportement par défaut de l'intégralité du thème.

Dans les thèmes, le style de focus visuel par défaut est généralement très simple. En voici une description approximative :

<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>

Quand utiliser des styles de focus visuels

Conceptuellement, l'apparence des styles de focus visuels appliquée aux différents contrôles doit être cohérente. Pour garantir cette cohérence, vous pouvez modifier le style de focus visuel uniquement si vous composez un thème entier, dans lequel chaque contrôle défini obtient le même style de focus visuel ou une variation d'un style visuellement lié entre les différents contrôles. Vous pouvez aussi utiliser le même style (ou des styles similaires) pour chaque élément pouvant être désignés comme éléments actifs via le clavier dans une page ou une interface utilisateur.

La définition de FocusVisualStyle sur des styles de contrôle individuels n'appartenant pas à un thème n'est pas l'utilisation prévue des styles de focus visuels. Cela est dû au fait qu'un comportement visuel incohérent entre différents contrôles peut entraîner la confusion de l'utilisateur relativement au focus clavier. Si vous souhaitez définir des comportements spécifiques au contrôle du focus clavier qui sont délibérément incohérents dans un thème, il vaut mieux utiliser des déclencheurs dans les styles pour chaque propriété d'état d'entrée, comme IsFocused ou IsKeyboardFocused.

Les styles de focus visuels s'appliquent exclusivement au focus clavier. De ce fait, ils représentent un type de fonction d'accessibilité. Si vous souhaitez effectuer des modifications de l'interface utilisateur pour tout type de focus, que ce soit par le biais de la souris, du clavier ou par programme, vous ne devez pas utiliser des styles de focus visuels et vous devez plutôt opter pour des accesseurs Set et des déclencheurs dans les styles ou les modèles qui fonctionnent à partir de la valeur des propriétés de focus générales, comme IsFocused ou IsFocusWithin.

Comment créer un style de focus visuel

Le style de focus visuel que vous créez doit toujours avoir le TargetType de Control. Ce style doit se composer principalement d'un ControlTemplate. Vous ne spécifiez pas le type de cible comme étant le type où le style de focus visuel est assigné à FocusVisualStyle.

Étant donné que le type de cible est toujours Control, vous devez appliquer un style à l'aide des propriétés communes à tous les contrôles (utilisation des propriétés de la classe Control et de ses classes de base). Vous devez créer un modèle qui fonctionnera correctement comme une superposition à un élément d'interface utilisateur et qui ne masquera pas les zones fonctionnelles du contrôle. En général, cela signifie que la rétroaction visuelle doit apparaître à l'extérieur des marges du contrôle ou comme effets temporaires ou discrets qui ne bloqueront pas le test d'atteinte sur le contrôle auquel est appliqué le style de focus visuel. Les propriétés qui peuvent être utilisées dans la liaison du modèle et qui permettent de déterminer le dimensionnement et le positionnement de votre modèle de superposition comprennent ActualHeight, ActualWidth, Margin et Padding.

Alternatives à l'utilisation d'un style de focus visuel

Pour les cas où l'utilisation d'un style de focus visuel n'est pas appropriée, car vous n'appliquez un style qu'à des contrôles uniques ou car vous voulez renforcer le contrôle du modèle de contrôle, de nombreuses autres propriétés et techniques accessibles permettent de créer un comportement visuel en réponse à des changements du focus.

Les déclencheurs, accesseurs Set et accesseurs Set d'événement sont tous décrits en détail dans Application d'un style et création de modèles. La gestion des événements routés est abordée dans Vue d'ensemble des événements routés.

IsKeyboardFocused

Si vous vous intéressez particulièrement au focus clavier, la propriété de dépendance IsKeyboardFocused peut être utilisée pour une propriété Trigger. Un déclencheur de propriété contenu dans un style ou un modèle est une technique plus appropriée pour définir un comportement du focus clavier propre à un contrôle unique, et qui risque de ne pas correspondre visuellement au comportement de focus clavier d'autres contrôles.

IsKeyboardFocusWithin est une autre propriété de dépendance similaire, dont l'usage peut se révéler approprié si vous souhaitez appeler visuellement ce focus clavier dans la composition ou la zone fonctionnelle du contrôle. Par exemple, vous pouvez placer un déclencheur IsKeyboardFocusWithin de sorte qu'un panneau qui regroupe plusieurs contrôles apparaisse différemment, y compris si le focus clavier peut se trouver plus précisément sur un élément individuel dans ce panneau.

Vous pouvez également utiliser les événements GotKeyboardFocus et LostKeyboardFocus (ainsi que leurs équivalents d'aperçu). Vous pouvez utiliser ces événements comme base d'un EventSetter ou vous pouvez écrire des gestionnaires pour les événements dans un fichier code-behind.

Autres propriétés de focus

Si vous voulez que toutes les causes possibles de changement du focus produisent un comportement visuel, vous devez baser un accesseur Set ou un déclencheur sur la propriété de dépendance IsFocused ou bien sur les événements GotFocus ou LostFocus utilisés pour un EventSetter.

Voir aussi

Concepts

Application d'un style et création de modèles

Vue d'ensemble du focus

Vue d'ensemble des entrées

Référence

FocusVisualStyle

Autres ressources

Accessibilité