Applicazione di stili per lo stato attivo nei controlli e FocusVisualStyle

Windows Presentation Foundation (WPF) fornisce due meccanismi paralleli per modificare l'aspetto visivo di un controllo quando riceve lo stato attivo della tastiera. Il primo meccanismo consiste nell'usare i setter di proprietà per proprietà come IsKeyboardFocused all'interno dello stile o del modello applicato al controllo. Il secondo meccanismo consiste nel fornire uno stile separato come valore della FocusVisualStyle proprietà. Lo "stile di visualizzazione dello stato attivo" crea una struttura ad albero visuale separata per uno strumento decorativo che disegna sopra il controllo, invece di modificare la struttura ad albero visuale del controllo o di un altro elemento dell'interfaccia utente sostituendola. Questo argomento descrive gli scenari appropriati a ogni meccanismo.

Scopo dello stile di visualizzazione dello stato attivo

La funzionalità dello stile di visualizzazione dello stato attivo offre un "modello a oggetti" comune per introdurre un feedback utente visivo, basato sul passaggio tramite tastiera a un qualsiasi elemento dell'interfaccia utente. Questo è possibile senza bisogno di applicare un nuovo modello al controllo, né di conoscere la composizione specifica del modello.

Dal momento però che la funzionalità dello stile di visualizzazione dello stato attivo funziona a prescindere dai modelli di controllo, il feedback visivo che è possibile visualizzare per un controllo usando uno stile di visualizzazione dello stato attivo è necessariamente limitato. La funzionalità sovrappone una struttura ad albero visuale diversa (uno strumento decorativo visuale) sulla struttura ad albero visuale creata dal rendering di un controllo tramite il relativo modello. Questa struttura ad albero visuale separata viene definita usando uno stile che riempie la FocusVisualStyle proprietà.

Comportamento predefinito dello stile di visualizzazione dello stato attivo

Gli stili di visualizzazione dello stato attivo funzionano solo quando l'azione di impostazione dello stato attivo è stata iniziata dalla tastiera. Qualsiasi azione del mouse o modifica dello stato attivo a livello di codice disabilita la modalità degli stili di visualizzazione dello stato attivo. Per altre informazioni sulle differenze tra le modalità dello stato attivo, vedere Cenni preliminari sullo stato attivo.

I temi dei controlli includono un comportamento predefinito dello stile di visualizzazione dello stato attivo che diventa lo stile di visualizzazione dello stato attivo per tutti i controlli del tema. Questo stile del tema è identificato dal valore della chiave FocusVisualStyleKeystatica . Quando si dichiara uno stile di visualizzazione dello stato attivo personalizzato a livello di applicazione, questo sostituisce il comportamento dello stile predefinito dei temi. In alternativa, se si definisce l'intero tema, è necessario usare questa stessa chiave per definire lo stile del comportamento predefinito per tutto il tema.

Nei temi, lo stile di visualizzazione dello stato attivo predefinito in genere è molto semplice. Di seguito è riportata un'approssimazione generica:

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

Quando usare gli stili di visualizzazione dello stato attivo

Dal punto di vista concettuale, l'aspetto degli stili di visualizzazione dello stato attivo applicati ai controlli deve essere coerente da un controllo all'altro. Un modo per garantire la coerenza consiste nel modificare lo stile di visualizzazione dello stato attivo solo se si sta componendo un tema completo, in cui ogni controllo definito nel tema ottiene lo stesso stile di visualizzazione dello stato attivo o una variazione di uno stile visivamente coerente tra i vari controlli. In alternativa, si può usare lo stesso stile (o stili simili) per assegnare uno stile a ogni elemento della pagina o di un'interfaccia utente in grado di ricevere lo stato attivo tramite tastiera.

L'impostazione FocusVisualStyle su singoli stili di controllo che non fanno parte di un tema non è l'utilizzo previsto degli stili di visualizzazione dello stato attivo. Un comportamento visivo incoerente tra controlli può infatti creare confusione nell'esperienza utente relativamente allo stato attivo. Se si prevede comportamenti specifici del controllo per lo stato attivo della tastiera che non sono deliberatamente coerenti in un tema, un approccio molto migliore consiste nell'usare i trigger negli stili per le singole proprietà dello stato di input, ad esempio IsFocused o IsKeyboardFocused.

Gli stili di visualizzazione dello stato attivo funzionano esclusivamente per lo stato attivo da tastiera. Come tali, costituiscono un tipo di funzionalità di accessibilità. Se si vogliono apportare modifiche all'interfaccia utente per qualsiasi tipo di stato attivo, tramite mouse, tastiera o a livello di codice, è preferibile usare non gli stili di visualizzazione dello stato attivo, bensì setter e trigger all'interno degli stili oppure modelli che funzionino in base al valore delle proprietà generali dello stato attivo, ad esempio IsFocused o IsKeyboardFocusWithin.

Come creare uno stile di visualizzazione dello stato attivo

Lo stile creato per uno stile di visualizzazione dello stato attivo deve avere sempre .TargetTypeControl Lo stile deve essere costituito principalmente da un oggetto ControlTemplate. Non specificare il tipo di destinazione come tipo in cui viene assegnato lo stile di visualizzazione dello stato attivo all'oggetto FocusVisualStyle.

Poiché il tipo di destinazione è sempre Control, è necessario applicare uno stile usando proprietà comuni a tutti i controlli (usando le proprietà della Control classe e le relative classi di base). È necessario creare un modello che funzioni correttamente come sovrapposizione a un elemento dell'interfaccia utente e che non nasconda le aree funzionali del controllo. In generale, questo vuol dire che il feedback visivo deve essere visualizzato all'esterno dei margini del controllo o sotto forma di effetti temporanei o non intrusivi, che non blocchino l'hit testing sul controllo a cui viene applicato lo stile di visualizzazione dello stato attivo. Le proprietà che è possibile usare nell'associazione di modelli utili per determinare il ridimensionamento e il posizionamento del modello di sovrimpressione includono ActualHeight, ActualWidthMargin, e Padding.

Alternative all'uso di uno stile di visualizzazione dello stato attivo

Per le situazioni in cui non è appropriato usare uno stile di visualizzazione dello stato attivo, perché si sta assegnando uno stile solo a singoli controlli o perché si vuole un controllo maggiore sul modello del controllo, sono disponibili molte altre proprietà e tecniche accessibili che creano un comportamento visivo in risposta alle modifiche apportate allo stato attivo.

Trigger, setter e setter di eventi sono illustrati in dettaglio in Applicazione di stili e modelli. La gestione degli eventi indirizzati è illustrata in Cenni preliminari sugli eventi indirizzati.

IsKeyboardFocused

Se si è interessati specificamente allo stato attivo della tastiera, la IsKeyboardFocused proprietà di dipendenza può essere usata per una proprietà Trigger. Un trigger di proprietà in uno stile o in un modello rappresenta una tecnica più appropriata per la definizione di un comportamento dello stato attivo della tastiera specifico per un singolo controllo, che potrebbe non corrispondere visivamente al comportamento dello stato attivo della tastiera di altri controlli.

Un'altra proprietà di dipendenza simile è IsKeyboardFocusWithin, che potrebbe essere appropriata per l'uso se si vuole chiamare visivamente lo stato attivo della tastiera è in un punto qualsiasi all'interno della composizione o all'interno dell'area funzionale del controllo. Ad esempio, è possibile posizionare un IsKeyboardFocusWithin trigger in modo che un pannello che raggruppa diversi controlli venga visualizzato in modo diverso, anche se lo stato attivo della tastiera potrebbe essere più precisamente su un singolo elemento all'interno di tale pannello.

È anche possibile usare gli eventi GotKeyboardFocus e LostKeyboardFocus (nonché i relativi equivalenti di anteprima). È possibile usare questi eventi come base per un EventSetteroggetto oppure è possibile scrivere gestori per gli eventi nel code-behind.

Altre proprietà dello stato attivo

Se si desidera che tutte le possibili cause della modifica dello stato attivo generino un comportamento visivo, è consigliabile basare un setter o un trigger sulla IsFocused proprietà di dipendenza oppure in alternativa sugli GotFocus eventi o LostFocus usati per un oggetto EventSetter.

Vedi anche