Routing eventi

17 03 2008

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.


Azioni

Informazione

Lascia un commento

Puoi usare questi tag : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>