E' da un pò che ho iniziato a giocare con Silverlight e, come ormai quasi tutte le tecnologie Microsoft, mi piace proprio tanto.
Una delle prime cose che ho voluto provare è stata la gestione degli eventi lanciati dalla tastiera della macchina client su cui viene eseguito il mio controllo Silverlight.
La maggior parte dei controlli Silverlight di interfaccia infatti, espongono due eventi ben precisi per poter ascoltare cosa succede sulla tastiera dell'utente. Questi sono gli eventi KeyUp e KeyDown, che vengono scatenati rispettivamente al rilascio di un pulsante della tastiera e ad un eventuale pressione, nel momento in cui il controllo ha il focus.
Entrambi i metodi sono ereditati dalla classe UIElement, una delle classi base di Silverlight.
La gestione di tali eventi è molto semplice. Possono infatti essere registrati nella parte di code-behind del controllo Silverlight:
KeyDown += new KeyEventHandler(Page_KeyDown);
KeyUp += new KeyEventHandler(Page_KeyUp);
oppure direttamente all'interno del file .xaml:
<UserControl x:Class="SilverlightKeyboardEvents.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300" Background="White"
KeyDown="Page_KeyDown" KeyUp="Page_KeyUp">
</UserControl>
Così facendo, abbiamo gestito la pressione e il rilascio di tasti della tastiera di tutto il controllo. Il che significa che questi eventi possono essere scatenati da qualunque sotto-elemento posto all'interno del nostro user control che riceve il focus.
Poi, all'interno dei rispettivi gestori degli eventi KeyUp e KeyDown, abbiamo la possibilità di eseguire particolari operazioni a fronte della pressione o del rilascio di tasti da parte dell'utente. Il tasto che è stato schiacciato è disponibile grazie alla proprietà "Key" della classe KeyEventArgs, classe la cui istanza viene passata come parametro agli handler degli eventi in questione.
Sempre tramite la medesima classe, possiamo recuperare il codice legato al tasto premuto (secondo la codifica relativa alla piattaforma utilizzata dalla macchina client) e un'istanza del controllo che ha scatenato l'evento.
void Page_KeyUp(object sender, KeyEventArgs e)
{
Key tastoRilasciato = e.Key;
TextBox txt = e.OriginalSource as TextBox;
//operazioni a fronte del rilascio di un tasto }
void Page_KeyDown(object sender, KeyEventArgs e)
{
Key tastoPremuto = e.Key;
object sourceControl = e.OriginalSource;
//operazioni a fronte della pressione di un tasto della tastiera }
In questo modo, direi veramente semplice, possiamo dotare le nostre applicazioni Silverlight di particolari funzionalità legate all'utilizzo della tastiera. In applicazioni web, questo tipo di funzionalità erano disponibili scrivendo un pò di codice javascript, mentre ora, possiamo fare tutto nel nostro linguaggio ad oggetti preferito ;)
Vi lascio un piccolo esempio di quanto abbiamo visto fin'ora.
DEMO ONLINE | Source code