Condividi tramite


Eventi di anteprima

Gli eventi di anteprima, noti anche come eventi di tunneling, sono eventi indirizzati in cui la direzione della route passa dalla radice dell'applicazione verso l'elemento che ha generato l'evento e viene segnalato come origine nei dati dell'evento. Non tutti gli scenari di eventi supportano o richiedono eventi di anteprima; In questo argomento vengono descritte le situazioni in cui esistono eventi di anteprima, il modo in cui le applicazioni o i componenti devono gestirli e i casi in cui la creazione di eventi di anteprima in componenti o classi personalizzate potrebbe essere appropriata.

Anteprima di eventi e input

Quando si gestiscono gli eventi di anteprima in generale, prestare attenzione a contrassegnare gli eventi gestiti nei dati dell'evento. La gestione di un evento Preview su qualsiasi elemento diverso dall'elemento che lo ha generato (l'elemento segnalato come origine nei dati dell'evento) ha l'effetto di non fornire a un elemento la possibilità di gestire l'evento originato. A volte questo è il risultato desiderato, in particolare se gli elementi in questione esistono nelle relazioni all'interno della composizione di un controllo.

Per gli eventi di input in particolare, gli eventi di anteprima condividono anche le istanze dei dati degli eventi con l'evento bubbling equivalente. Se si usa un gestore della classe di evento Preview per contrassegnare l'evento di input gestito, il gestore della classe di evento di input bubbling non verrà richiamato. In alternativa, se si usa un gestore dell'istanza dell'evento Preview per contrassegnare l'evento gestito, i gestori per l'evento di bubbling non verranno in genere richiamati. I gestori di classe o i gestori di istanza possono essere registrati o collegati con un'opzione da richiamare anche se l'evento è contrassegnato come gestito, ma tale tecnica non viene comunemente usata.

Per altre informazioni sulla gestione delle classi e sulla relativa correlazione con gli eventi di anteprima, vedere Contrassegnare gli eventi indirizzati come gestiti e gestione delle classi.

Soluzioni alternative all'eliminazione di eventi da parte dei controlli

Uno scenario in cui gli eventi di anteprima vengono comunemente usati è per la gestione composita dei controlli degli eventi di input. In alcuni casi, l'autore del controllo elimina un determinato evento proveniente dal controllo, ad esempio per sostituire un evento definito dal componente che contiene altre informazioni o implica un comportamento più specifico. Ad esempio, windows Presentation Foundation (WPF) Button elimina MouseLeftButtonDown e MouseRightButtonDown genera eventi di bubbling generati da o dai Button relativi elementi compositi a favore dell'acquisizione del mouse e della generazione di un Click evento che viene sempre generato dall'oggetto Button stesso. L'evento e i relativi dati continuano ancora lungo la route, ma poiché contrassegna i Button dati dell'evento come Handled, vengono richiamati solo i gestori per l'evento che specificamente indicato devono agire nel handledEventsToo caso. Se altri elementi verso la radice dell'applicazione volevano comunque avere l'opportunità di gestire un evento eliminato dal controllo, un'alternativa consiste nel collegare gestori nel codice con handledEventsToo specificato come true. Tuttavia, spesso una tecnica più semplice consiste nel modificare la direzione di routing gestita in modo che sia l'equivalente preview di un evento di input. Ad esempio, se un controllo elimina MouseLeftButtonDown, provare ad associare un gestore per PreviewMouseLeftButtonDown . Questa tecnica funziona solo per gli eventi di input degli elementi di base, ad MouseLeftButtonDownesempio . Questi eventi di input usano coppie tunnel/bolle, generano entrambi gli eventi e condividono i dati dell'evento.

Ognuna di queste tecniche presenta effetti collaterali o limitazioni. L'effetto collaterale della gestione dell'evento Preview è che la gestione dell'evento in quel punto potrebbe disabilitare i gestori che prevedono di gestire l'evento di bubbling e pertanto la limitazione è che in genere non è consigliabile contrassegnare l'evento gestito mentre è ancora nella parte Preview della route. La limitazione della handledEventsToo tecnica consiste nel fatto che non puoi specificare un handledEventsToo gestore in XAML come attributo, devi registrare il gestore eventi nel codice dopo aver ottenuto un riferimento all'oggetto all'elemento in cui deve essere associato il gestore.

Vedi anche