Technology Experience
Senza categoria

Silverlight 4: settare il focus su un controllo

Dunque, la questione è semplice, e non so fare paragoni con le precedenti versioni di Silverlight, perchè io ho cominciato a lavorare sull’ultima, prossima ad uscire sul mercato, cioè la 4.

Si fa click su un bottone e si apre una ChildWindow, che ad esempio serve a fare un login:

public void Execute(object parameter) { wnd = new LoginWindow(); wnd.Closed += new EventHandler(wnd_Closed); wnd.Show(); }

La differenza per chi ha lavorato con WPF – ad esempio – è che la ChildWindow non è veramente modale, per cui appare una volta chiamato il metodo Show(). Dobbiamo intercettare l’evento Closed per sapere quando l’utente chiude la Window, cliccando Ok/Cancel o la X in alto a destra, o con altri pulsanti creati da noi.

Ma torniamo al tema di questo post. Come facciamo a dare il focus ad un controllo sulla ChildWindow una volta che questa appare? Cercando su Google ho trovato una miriade di soluzioni diverse, tutte non funzionanti. Le principali e le più quotate sono due:

  1. intercettare l’evento Loaded della ChildWindow: nell’event handler settare il focus con un semplice this.nomeControllo.Focus(); – ditemi quello che volete ma a me non va: semplicemente la ChildWindow appare, ma il controllo (ad esempio una TextBox) non ha il focus
  2. intercettare l’evento GotFocus della ChildWindow ed agire come prima. Qui è anche peggio, perchè effettivamente il focus si sposta sul controllo, ma poi non riusciamo più ad andarcene. Evidentemente premendo Tab o cliccando su un altro controllo, si scatena comunque il GotFocus della ChildWindow, e quindi il focus rimane lì dov’è.

E ho visto soluzioni molto più complesse, che usavano attached property, classe create ad hoc per implementare una sorta di FocusManager simile a quello disponibile per WPF. Pazzesco.

L’unica, vera, immancabile, incontrovertibile, irrinunciabile, giusta soluzione, ce l’ho io: basta semplicemente impostare il TabIndex a 0 sul primo controllo, a 1 sul secondo controllo e così via. In questo modo, quindi, quando la ChildWindow appare il focus viene messo sul controllo che ha il TabIndex più basso, e premendo Tab mi sposto sugli altri seguendo l’ordine. Un po’ come si faceva con Windows Forms ed il buon vecchio Visual Basic una volta. Più semplice di così si muore.

Bravo Igor! Se ci sono obiezioni o correzioni, sono tutt’orecchi.

Send to Kindle

Igor Damiani

La sua passione per l'informatica nasce nella prima metà degli anni '80, quando suo padre acquistò un Texas Instruments TI-99. Da allora ha continuato a seguire l'evoluzione sia hardware che software avvenuta nel corso degli anni. E' un utente, un videogiocatore ed uno sviluppatore software a tempo pieno. Igor ha lavorato e lavora anche oggi con le più moderne tecnologie Microsoft per lo sviluppo di applicazioni: .NET Framework, XAML, Universal Windows Platform, su diverse piattaforme, tra cui spiccano Windows 10 piattaforme mobile. Numerose sono le app che Igor ha creato e pubblicato sul marketplace sotto il nome VivendoByte, suo personale marchio di fabbrica. Adora mantenere i contatti attraverso Twitter e soprattutto attraverso gli eventi delle community .NET.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.