Fokusstile in Steuerelementen und FocusVisualStyle

Windows Presentation Foundation (WPF) stellt zwei parallele Mechanismen zum Ändern der Darstellung eines Steuerelements bereit, wenn es den Tastaturfokus erhält. Der erste Mechanismus besteht in der Verwendung von Eigenschaftensettern für Eigenschaften wie IsKeyboardFocused innerhalb des Stils oder der Vorlage, der oder. die auf das Steuerelement angewendet wird. Der zweite Mechanismus besteht in der Bereitstellung eines gesonderten Stils als Wert für die Eigenschaft FocusVisualStyle. Der „visuelle Fokusstil“ erstellt eine separate visuelle Struktur für einen Adorner, der dem Steuerelement überlagert wird, anstatt die visuelle Struktur des Steuerelements oder eines anderen Elements der Benutzeroberflächen durch Ersetzen zu ändern. In diesem Thema werden die Szenarios erläutert, für die sich die jeweiligen Mechanismen eignen.

Zweck des Visuellen Fokusstils

Der visuelle Fokusstils stellt ein gemeinsames „Objektmodell“ bereit, mit dem ein visuelles Benutzerfeedback auf der Basis der Tastaturnavigation zu einem beliebigen Element der Benutzeroberfläche eingeführt wird. Dazu muss keine neue Vorlage für das Steuerelement angewendet werden und die spezifische Vorlagenzusammensetzung muss nicht bekannt sein.

Da jedoch die Funktion des visuellen Fokusstils ohne Kenntnis der Steuerungsvorlagen funktioniert, ist das visuelle Feedback, das für ein Steuerelement unter Verwendung eines visuellen Fokusstils angezeigt werden kann, beschränkt. Das Feature überlagert die visuelle Struktur nämlich einfach durch eine andere visuelle Struktur (einen Adorner), die durch das Rendern eines Steuerelements über seine Vorlage erstellt wird. Sie definieren diesen separaten visuellen Baum mithilfe eines Stils, der die FocusVisualStyle-Eigenschaft ausfüllt.

Standardverhalten des visuellen Fokusstils

Visuelle Fokusstile werden nur dann wirksam, wenn die Fokusaktion über die Tastatur gestartet wurde. Eine Mausaktion oder eine programmatische Fokusänderung deaktivieren den Modus für visuelle Fokusstile. Weitere Informationen über die Unterschiede zwischen den Fokusmodi finden Sie unter Fokus-Übersicht.

Die Designs für Steuerelemente umfassen ein Standardverhalten für den visuellen Fokusstil, das zum visuellen Fokusstil für alle Steuerelemente in diesem Design wird. Dieser Themenstil wird durch den Wert des statischen FocusVisualStyleKey-Schlüssels identifiziert. Wenn Sie einen eigenen visuellen Fokusstil auf der Anwendungsebene deklarieren, ersetzen Sie das Standardverhalten des Stils in den Designs. Wenn Sie hingegen das gesamte Design definieren, sollten Sie diesen Schlüssel auch verwenden, um den Stil für das Standardverhalten des gesamten Designs zu definieren.

In den Designs ist der Standardstil für den visuellen Fokus im Allgemeinen sehr einfach. Im Folgenden finden Sie eine grobe Übersicht:

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

Verwendung von visuellen Fokusstilen

Im Prinzip sollte die Darstellung der visuellen Fokusstile, die für die Steuerelemente übernommen werden, kohärent sein. Eine Methode zur Sicherstellung der Kohärenz besteht darin, den visuellen Fokusstil nur dann zu ändern, wenn Sie ein vollständiges Design erstellen, in dem für jedes definierte Steuerelement, das in dem Design definiert wird, derselbe visuelle Fokusstil oder eine Variation eines Stils festgelegt wird, der von Steuerelement zu Steuerelement verknüpft ist. Alternativ können Sie denselben Stil (oder ähnliche Stile) zur Formatierung aller Elemente auf einer Seite oder in einer Benutzeroberfläche verwenden, die den Tastaturfokus erhalten können.

Das Festlegen von FocusVisualStyle für einzelne Steuerelementstile, die nicht Teil eines Designs sind, wird als Verwendung des visuellen Fokusstils nicht empfohlen. Dieses inkonsistente visuelle Verhalten zwischen Steuerelementen könnte zu einer verwirrenden Nutzererfahrung hinsichtlich des Tastaturfokus führen. Wenn Sie steuerelementspezifische Verhaltensweisen für den Tastaturfokus festlegen möchten, die designübergreifend bewusst nicht kohärent sind, stellt das Verwenden von Triggern in Stilen für einzelne Eingabezustandseigenschaften wie z.B. IsFocused oder IsKeyboardFocused eine deutlich geeignetere Herangehensweise dar.

Visuelle Fokusstile sind ausschließlich für den Tastaturfokus wirksam. Visuelle Fokusstile sind somit eine Art Barrierefreiheitsfunktion. Wenn Sie eine Änderung der Benutzeroberfläche für jeden Fokustyp erreichen möchten, egal ob über Mausklick, Tastatureingabe oder programmgesteuert, sollten Sie keine visuellen Fokusstile verwenden. Stattdessen sollten Sie Setter und Trigger in Stilen oder Vorlagen einsetzen, die auf der Basis des Werts allgemeiner Fokuseigenschaften arbeiten, wie z.B. IsFocused oder IsKeyboardFocusWithin.

Erstellen eines visuellen Fokusstils

Der Stil, den Sie für einen visuellen Fokus-Stil erstellen, sollte immer TargetType von Control haben. Der Stil sollte hauptsächlich aus einem ControlTemplate bestehen. Sie geben den Zieltyp nicht als den Typ an, bei dem der visuelle Fokusstil dem FocusVisualStyle zugewiesen ist.

Da der Zieltyp immer Control ist, müssen Sie zum Erstellen des Stils Eigenschaften verwenden, die allen Steuerelementen gemeinsam sind (mithilfe von Eigenschaften der Control-Klasse und deren Basisklassen). Sie sollten eine Vorlage erstellen, die ordnungsgemäß als Überlagerung für ein Benutzeroberflächenelement dient und keine funktionalen Bereiche des Steuerelements verdeckt. Im Allgemeinen bedeutet das, dass das visuelle Feedback außerhalb der Ränder eines Steuerelements oder als temporärer oder unaufdringlicher Effekt dargestellt werden sollte, sodass der Treffertest für das Steuerelement bei übernommenem visuellem Fokusstil nicht blockiert wird. Zu den Eigenschaften, die Sie in der Vorlagenbindung verwenden können und die für die Bestimmung der Größe und Positionierung Ihrer Overlay-Vorlage nützlich sind, gehören ActualHeight, ActualWidth, Margin und Padding.

Alternativen zur Verwendung eines visuellen Fokusstils

In Situationen, in denen die Verwendung eine visuellen Fokusstils nicht angemessen ist, weil Sie beispielsweise einzelne Steuerelemente formatieren oder die Steuerelementvorlage noch weitreichender steuern möchten, stehen viele andere Eigenschaften und Techniken zur Verfügung, mit denen Sie ein visuelles Verhalten als Reaktion auf eine Fokusänderung erstellen können.

Trigger, Setter und Ereignissetter werden ausführlich unter Erstellen von Formaten und Vorlagen erläutert. Die Routingereignisbehandlung wird unter Übersicht über Routingereignisse erläutert.

IsKeyboardFocused

Wenn Sie speziell am Tastaturfokus interessiert sind, kann die IsKeyboardFocused-Abhängigkeitseigenschaft für eine Trigger-Eigenschaft verwendet werden. Ein Eigenschaftentrigger in einem Stil oder einer Vorlage ist eine gut geeignete Technik, um ein Tastaturfokusverhalten zu definieren, das speziell für ein einziges Steuerelement gilt und das visuell nicht dem Tastaturfokusverhalten anderer Steuerelemente entspricht.

Eine weitere ähnliche Abhängigkeitseigenschaft ist IsKeyboardFocusWithin, die verwendet werden kann, wenn Sie visuell hervorheben möchten, dass sich der Tastaturfokus an einer Position innerhalb der Zusammensetzung oder innerhalb des funktionalen Bereichs des Steuerelements befindet. So können Sie beispielsweise einen IsKeyboardFocusWithin-Trigger so platzieren, dass ein Bereich, in dem mehrere Steuerelemente gruppiert sind, anders dargestellt wird, auch wenn der Tastaturfokus auf genau einem der einzelnen Elemente innerhalb dieses Bereichs liegt.

Sie können auch die Ereignisse GotKeyboardFocus und LostKeyboardFocus (sowie die entsprechenden Vorschauen) verwenden. Sie können diese Ereignisse als Basis für einen EventSetter verwenden, oder Sie können Handler für die Ereignisse in CodeBehind schreiben.

Andere Fokuseigenschaften

Wenn Sie möchten, dass alle möglichen Ursachen für die Änderung des Fokus ein visuelles Verhalten hervorrufen, sollten Sie einen Setter oder Trigger auf der IsFocused-Abhängigkeitseigenschaft oder alternativ auf den GotFocus- oder LostFocus-Ereignissen basieren, die für eine EventSetter verwendet werden.

Weitere Informationen