Routing eventi

Giocando con le griglie sono incappato in un problemino: date due griglie innestate non volevo che la griglia padre ricevesse gli eventi della griglia figlia.

Quindi partendo da questo XAML

associato a questo codice per la gestione degli eventi

private void grdBlue_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("Blue grid click");
}
private void grdRed_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("Red grid click");
}

otteniamo che cliccando sul rettangolino rosso appare prima la messagebox con “Red grid click” e successivamente la messagebox con “Blue grid click”.

per evitare che scatti anche l’evento sulla grdBlue è sufficiente settare come gestite l’evento

private void grdRed_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("Red grid click");
e.Handled = true;
}

In questo modo il routing dell’evento si fermerà alla grdRed.
(In realtà è sufficiente sottoscriversi ad un evento tramite il metodo void UIElement.AddHandler(RoutedEvent routedEvent, Delegate handler, bool handledEventsToo) passando handledEventsToo a true per intercettare mettodi già gestiti.
Metodo UIElement..::.AddHandler (RoutedEvent, Delegate, Boolean)
)

Se invece volessimo ottenere l’opposto, ovvero che venga ignorata la grdRed quando viene cliccata ci basterebbe settare la proprietà IsHitTestVisible=”False” nello XAML.

Cliccando sulla griglia rossa ora verrà lanciato solo l’evento della griglia padre (ovvero il click sulla grdBlue).

Un’altra cosa che si può fare è utilizzare un gestore per un evento di tutti i figli sfruttando gli eventi indirizzati(Routed Events)
Cenni preliminari sugli eventi indirizzati

Supponiamo il caso di avere una griglia con n bottoni al suo interno e di voler utlizzare lo stesso handler per tutti i bottoni.

Una soluzione potrebbe essere quella di sottoscrivere l’evento click bottone per bottone all’handler scrivendo però parecchio codice in più.
La soluzione migliore è quella di impostare il handler nel padre (nell’esempio sopra ButtonBase.Click=”grdBlue_btnClick”), in questo modo tutti i suoi figli usufruiranno di questa sottoscrizione.



private void grdBlue_btnClick(object sender, RoutedEventArgs e)
{
Button btn = (Button)e.OriginalSource ;
MessageBox.Show("Blue grid click: " + btn.Name);
}

Il sender dell’evento sarà la griglia che ha definito l’handler; mentre il button che ha lanciato l’evento è memorizzato in e.OriginalSource.

Annunci
Tagged with: , , , , ,
Pubblicato su C#, WPF

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: