ASP.Net  »  Guide  »  Guida Silverlight 

Routed Event



La maggior parte degli eventi esposti dai controlli Silverlight 2 sono i tipici eventi .NET, alcuni però sono eventi particolari chiamati Routed Event e sono:

Routed Event
KeyDownKeyUpGotFocusLostFocus
MouseLeftButtonDownMouseLeftButtonUp MouseMoveBindingValidationError

La caratteristica di questo tipo di evento, chiamato anche Bubbling Event, è che non viene notificato solo sul controllo che lo scatena, ma viene propagato lungo tutto l'Object Tree, risalendo in sequenza gli oggetti padre, ammettendo quindi gestori multipli.

Per comprendere meglio questa caratteristica procediamo con una demo, in una pagina Silverlight inseriamo un controllo StackPanel con un elemento figlio, un semplice Rectangle. Infine per entrambi i controlli definiamo un handler per l'evento MouseLeftButtonDown.

<StackPanel x:Name="LayoutRoot" Width="300" Background="Blue"
            MouseLeftButtonDown="LayoutRoot_MouseLeftButtonDown">

  <Rectangle Fill="Black" Height="50" Width="100" Margin="10"
             MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" />
</StackPanel>

Figura 20. StackPanel con rettangolo

StackPanel con rettangolo

Nei metodi generati nel code-behind invochiamo il metodo WriteLine della classe Debug passando come parametro il nome dell'hanlder, il quale sarà stampato nella console di output del debugger di Visual Studio.

private void LayoutRoot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Debug.WriteLine("-------------------------------------------------");
    Debug.WriteLine("LayoutRoot_MouseLeftButtonDown");
}

private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Debug.WriteLine("-------------------------------------------------");
    Debug.WriteLine("Rectangle_MouseLeftButtonDown");
}

Lanciamo l'applicazione e clicchiamo sul rettangolo nero, il risultato nella console di output saranno presenti entrambi i messaggi.

Figura 21. Messaggi

I messaggi provocati dagli eventi

Questo particolare comportamento è molto utile nei casi in cui vogliamo creare un unico gestore degli eventi del mouse o della tastiera, scenario tipico di un videogame.

Dato che il parametro sender rappresenta sempre il controllo dell'attuale gestore del Routed Event, per capire qual è stato il primo elemento dell'interfaccia utente a scatenare l'evento dobbiamo consultare la proprietà OriginalSource del parametro EventArgs.

private void LayoutRoot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Debug.WriteLine("-------------------------------------------------");
    Debug.WriteLine("LayoutRoot_MouseLeftButtonDown");
    Debug.WriteLine("sender: " + sender);
    Debug.WriteLine("OriginalSource: " + e.OriginalSource);
}

private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Debug.WriteLine("-------------------------------------------------");
    Debug.WriteLine("Rectangle_MouseLeftButtonDown");
    Debug.WriteLine("sender: " + sender);
    Debug.WriteLine("OriginalSource: " + e.OriginalSource);
}

Figura 22. Risultato

DESCRIZIONE

Mentre per interrompere l'attraversamento dei controlli basta impostare la proprietà handled del parametro EventArgs a true.

private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Debug.WriteLine("-------------------------------------------------");
    Debug.WriteLine("Rectangle_MouseLeftButtonDown");
    e.Handled = true;
}

Ultimi articoli ASP.Net

LINQ e la trappola della 'deferred execution'

Una "trappola" in cui si può incappare utilizzando il risultato di...

C#, le Custom Type Conversion

Conversioni personalizzate tra classi, creare metodi particolari per...

Introduzione a Entity Framework

Il framework ORM messo a disposizione da .NET

Repeater: visualizzare un feed RSS

Utilizzare il controllo XMLDataSource e sfruttare il metodo XPath()...

Repeater, il server control "semplice"

Cos'è e come funziona il controllo Repeater

Altri articoli

Guide ASP.Net

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Guida Visual Studio 2010

L'ambiente di sviluppo di riferimento per sviluppare applicazioni su...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Progettazione database

11 Maggio 2012 a Milano
Disponibilità: 6 Posti

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto