Quando dobbiamo realizzare delle interfacce per l'immissione dati che contengono più di una TexBox, può risultare utile passare da un controllo all'altro utilizzando la tabulazione. La tastiera di Windows Phone, a differenza di quella de personal computer, non ha un tasto per la tabulazione, quindi, le proprietà TabIndex e IsTabStop, rischiano di rimanere inutilizzate.
Per ovviare a questo problema, possiamo realizzare un behavior, che alla pressione del tasto invio, sposti il focus all'elemento successivo nell'ordine determinato dal valore della proprietà TabIndex. Creiamo una nuova classe, e chiamiamola TabNavigationBehavior, estendiamo il tipo Behavior, e impostiamo il generic gype parameter al tipo Panel.
public class TabNavigationBehavior : Behavior<Panel> { }
Eseguiamo l'override del metodo OnAttached, e sottoscriviamo l'evento KeyDown in modo da richiamare il metodo OnKeyDown.
protected override void OnAttached() { base.OnAttached(); this.AssociatedObject.KeyDown += OnKeyDown; }
Il metodo OnKeyDown riceve due parametri: "sender", del tipo object , rappresenta un riferimento all'oggetto associato all'evento, ed "e", del tipo KeyEventArgs. Controlliamo mediante la proprietà Key esposta dal tipo KeyEventArgs, che il tasto che ha ricevuto il tap corrisponda l'invio.
In caso affermativo utilizziamo il metodo CreateControlCollection per popolare una collezione chiamata controls, contenente i controlli contenuti nel pannello. Selezioniamo solo i controlli con la proprietà IsTabStop impostata a true e ordiniamo utilizzando il valore della proprietà TabIndex.
private void CreateControlCollection() { controls = AssociatedObject.Children.OfType<Control>().Where(c => c.IsTabStop).OrderBy(c => c.TabIndex).ToList(); }
Se la collezione contiene più di un elemento, utilizziamo il metodo GetFocusElement, esposto dalla classe FocusManager, per recuperare l'elemento che ha il Focus e salvarlo nel campo focusedControl.
Recuperiamo la posizione che il controllo focusedControl occupa all'interno della collezione controls, e usiamo l'indice così ottenuto per recuperare l'elemento successivo che deve ricevere il focus .
void OnKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { if (controls == null) CreateControlCollection(); if (controls.Count > 0) { Control focusedControl = FocusManager.GetFocusedElement() as Control; if (focusedControl == null) focusedControl = controls[0]; int index = controls.IndexOf(focusedControl); Control nextFocusedControl = index + 1 >= controls.Count ? controls[0] : controls[index + 1]; nextFocusedControl.Focus(); } } }
Non ci resta che compilare e associare il behavior al pannello che contiene l'interfaccia d'immissione dati.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Sviluppare un'interfaccia utente in React con Tailwind CSS e Preline UI
Creare gruppi di client per Event Grid MQTT
Usare una container image come runner di GitHub Actions
Generare velocemente pagine CRUD in Blazor con QuickGrid
Hosting di componenti WebAssembly in un'applicazione Blazor static
Applicare un filtro per recuperare alcune issue di GitHub
Aggiungere interattività lato server in Blazor 8
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Utilizzare i primary constructor di C# per inizializzare le proprietà
Gestione dell'annidamento delle regole dei layer in CSS
Usare le navigation property in QuickGrid di Blazor
I più letti di oggi
- Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
- Creare una libreria CSS universale: Cards
- Eseguire script pre e post esecuzione di un workflow di GitHub