Un'applicazione frequente degli eventi indirizzati nella piattaforma WPF riguarda gli eventi di input. In WPF, i nomi degli eventi indirizzati di tunneling sono preceduti dalla parola "Preview" per convenzione. Gli eventi di input sono spesso in coppia, uno rappresenta l'evento di bubbling e l'altro quello di tunneling. Ad esempio, l'evento KeyDown e l'evento PreviewKeyDown hanno la stessa firma: il primo è l'evento di input di bubbling e il secondo è l'evento di input di tunneling. In alcuni casi, gli eventi di input hanno solo una versione di bubbling o solo una versione indirizzata diretta. Nella documentazione, per gli argomenti relativi agli eventi indirizzati vi sono riferimenti incrociati a eventi indirizzati simili con strategie di routing alternative, se disponibili, e le sezioni nelle pagine di riferimenti gestiti chiariscono la strategia di routing per ogni evento indirizzato.
Gli eventi di input WPF in coppia vengono implementati in modo che una sola azione di input dell'utente, ad esempio la pressione di un pulsante del mouse, generi entrambi gli eventi indirizzati della coppia in sequenza. Per prima cosa, viene generato l'evento di tunneling, che avanza nella route. Successivamente, viene generato l'evento di bubbling, che avanza nella route. I due eventi condividono letteralmente la stessa istanza dei dati di evento, poiché la chiamata al metodo RaiseEvent nella classe di implementazione che genera l'evento di bubbling rimane in ascolto per i dati di evento dall'evento di tunneling e li riutilizza nel nuovo evento generato. I listener con gestori per l'evento di tunneling hanno l'opportunità di contrassegnare per primi l'evento indirizzato come gestito (prima i gestori di classi, quindi i gestori di istanze). Se un elemento nella route di tunneling ha contrassegnato l'evento indirizzato come gestito, i dati di evento già gestiti vengono inviati per l'evento di bubbling e i gestori tipici associati per gli eventi di input di bubbling equivalenti non vengono richiamati. Dall'esterno, potrebbe sembrare che l'evento di bubbling gestito non sia mai stato generato. Questo comportamento di gestione è utile per la composizione di controlli, in cui può essere opportuno che tutti gli eventi di input basati su hit test o gli eventi di input basati su stato attivo vengano riportati dal controllo finale, piuttosto che dalle relative parti composite. L'elemento di controllo finale è più vicino alla radice nella composizione, pertanto ha la possibilità di gestire prima la classe dell'evento di tunneling ed eventualmente di sostituire tale evento indirizzato con un evento più specifico del controllo, come parte del codice sottostante la classe del controllo.
Come dimostrazione della modalità di funzionamento dell'elaborazione degli eventi di input, si consideri l'esempio di evento di input riportato di seguito. Nell'illustrazione della struttura ad albero riportata di seguito, leaf element #2 rappresenta l'origine di un evento PreviewMouseDown e di un evento MouseDown.
Bubbling e tunneling degli eventi di input
.png)
L'ordine di elaborazione degli eventi è il seguente:
PreviewMouseDown (tunneling) sull'elemento radice.
PreviewMouseDown (tunneling) sull'elemento intermedio #1.
PreviewMouseDown (tunneling) sull'elemento di origine #2.
MouseDown (bubbling) sull'elemento di origine #2.
MouseDown (bubbling) sull'elemento intermedio #1.
MouseDown (bubbling) sull'elemento radice.
Un delegato del gestore eventi indirizzati fa riferimento a due oggetti: l'oggetto che ha generato l'evento e quello in cui è stato richiamato il gestore. L'oggetto in cui è stato richiamato il gestore è quello indicato dal parametro sender. L'oggetto in cui l'evento è stato generato per la prima volta è indicato dalla proprietà Source nei dati di evento. Un evento indirizzato può ancora essere generato e gestito dallo stesso oggetto, nel qual caso sender e Source sono identici (si tratta del caso riportato nei passaggi 3 e 4 nell'elenco di esempi di elaborazione degli eventi).
A causa del tunneling e del bubbling, gli elementi padre ricevono eventi di input in cui Source è uno dei relativi elementi figlio. Quando è importante conoscere l'elemento di origine, è possibile identificare l'elemento di origine mediante l'accesso alla proprietà Source.
In genere, dopo avere contrassegnato l'evento di input come Handled, non vengono richiamati ulteriori gestori. Di solito, è necessario contrassegnare gli eventi di input come gestiti non appena viene richiamato un gestore che risponde alla gestione logica specifica dell'applicazione del significato dell'evento di input.
L'eccezione a questa istruzione generale sullo stato Handled è data dal fatto che i gestori di eventi di input registrati per ignorare intenzionalmente lo stato Handled dei dati di evento verranno ancora richiamati lungo la route. Per ulteriori informazioni, vedere Eventi di anteprima o Contrassegno degli eventi indirizzati come gestiti e gestione delle classi.
Il modello dei dati di evento condivisi tra eventi di tunneling e di bubbling e la generazione sequenziale di eventi di tunneling e di bubbling non è un concetto generalmente vero per tutti gli eventi indirizzati. Tale comportamento viene specificamente implementato dal modo in cui i dispositivi di input WPF scelgono di generare e connettere le coppie di eventi di input. L'implementazione di eventi di input personalizzati è un scenario avanzato, ma è possibile scegliere di seguire tale modello anche per eventi di input personalizzati.
Alcune classi scelgono di gestire tramite classi determinati eventi di input, di solito con l'intenzione di ridefinire il significato di un determinato evento di input generato dall'utente all'interno di tale controllo e di generare un nuovo evento. Per ulteriori informazioni, vedere Contrassegno degli eventi indirizzati come gestiti e gestione delle classi.
Per ulteriori informazioni sull'input e su come input ed eventi interagiscono in scenari di applicazioni tipici, vedere Cenni preliminari sull’input.