Ogni elemento visuale con il quale potenzialmente l'utente può interagire è un oggetto che può detenere il focus e ricevere tutti gli input provenienti dalla tastiera. Il meccanismo di gestione è, come per molte caratteristiche di Windows Presentation Foundation, separato da quello di Win32, nuovo, più versatile ed è controllabile mediante le classi FocusManager e KeyboardNavigation.

In particolare, tramite le attached properties è possibile impostare qual è oggetto che detiene il focus da tastiera, univoco per l'intera esperienza dell'utente, e quali sono le zone logiche di focus, anche da XAML. Quest'ultime possono essere molteplici in un'applicazione ed ognuna di essa ha un oggetto detentore del focus che opzionalmente può avere anche il focus da tastiera. Solitamente questi scope si identificano all'interno dei menu e dei gruppi.

L'esempio seguente imposta, con FocusedElement, la textBox di ID name come focus predefinito al caricarsi del Canvas, definisce con IsFocusScope il pannello stesso come contenitore logico di gestione dei focus, e indica con TabNavigation che la navigazione deve iterare continuamente all'interno dello spazio logico quando si preme il tab:

<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  FocusManager.IsFocusScope="True"
  KeyboardNavigation.TabNavigation="Cycle"
  FocusManager.FocusedElement="{Binding ElementName=name}">

  <TextBox x:Name="name" />
  <TextBox x:Name="surname" />

</StackPanel>

Oltre alla navigazione con tab è possibile controllare quella con il control+tab sfruttando l'attached property ControlTabNavigation e quella basata sull'uso delle frecce, sfruttando DirectionalNavigation.

I possibili valori per la navigazione sono:
- Continue: il focus da tastiera passa da uno scope all'altro quando viene raggiunto l'ultimo elemento;
- Cylce: il focus cicla dal primo all'ultimo elemento dello scope e raggiunta la fine o l'inizio, ricomincia da capo;
- Local: il focus si basa sulle impostazioni del contenitore;
- None: non è possibile effettuare una navigazione all'interno dello scope;
- Once: una volta che un elemento dello scope ha ottenuto il focus, la navigazione passa allo scope successivo.

Da codice è possibile impostare il focus sia tramite il metodo Focus esposto dai tipi IInputElement e conoscere se uno di essi detiene il focus con la proprietà IsKeyboardFocused o IsKeyboardFocusWithin (considera anche i figli).

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi