I Routed Event sono stati introdotti con l'avvento di WPF; molto in sintesi, sono eventi che vengono propagati lungo tutto l'albero di controlli della nostra Window, ammettendo quindi gestori multipli: per esempio se abbiamo uno StackPanel con dentro un Button con dentro una Image, l'evento click generato dal click del mouse sulla Image verrà propagato anche al Button e in seguito allo StackPanel. Qui potrete trovare maggiori info.
Di seguito invece un piccolo tip per l'uso delle TreeView. Ho implementato un piccolo programmino che prevede la rappresentazione di dati in un albero e la gestione del Drag and Drop. A questo scopo ogni TreeViewItem ha associato all'evento Drop un delegato (lo stesso per ogni item). Il problema, se tale si può definire, è dato dal fatto che essendo Drop un Routed Event, ogni qualvolta l'utente rilascia (o meglio "Droppa" :) ), qualcosa sul TreeViewItem desiderato, la gestione viene propagata a di Parent in Parent sino alla radice, eseguendo quindi N volte lo stesso metodo. Evitare questo comportamento è semplice: RoutedEventArgs espone una proprietà booleana Handled, che permette di interrompere la propagazione dell'evento agli altri gestori. Essendo quindi il gestore designato nella mia soluzione il destinatario del Drop mi è bastato impostare Handled a true all'interno del delegato:
void node_Drop(object sender, System.Windows.DragEventArgs e)
{
...
e.Handled = true;
}
Interessanti questi Routed Event, ma se non li segui... :)
Matteo