2009-09-22 12 views
62

Ho cercato descrizioni di eventi "Anteprima ******" come ogni elemento ha eventi KeyDown e PreviewKeyDown. Qual è la differenza (evento non che uno è collegato e non è, la vera differenza e convenzionale modo di programmazione differenza)Che cosa sono gli eventi di anteprima WPF?

In ogni classe derivata da Control, è possibile escludere entrambi i metodi .. onKeyDown e OnPreviewKeyDown, ora sto scrivendo il mio controllo personalizzato, quale metodo devo usare? E che differenza c'è tra entrambi.

risposta

105

Da Programming WPF - Chris Sells e Ian Griffith

Con l'eccezione di eventi diretti, WPF definisce gli eventi più in rotta in coppie - un tunnel e l'altro bubbling. Il nome evento tunneling inizia sempre con "Anteprima" ed è sollevato per primo. Questo dà ai genitori la possibilità di vedere l'evento per raggiungere il bambino. Questo è seguito da la controparte ribollente. Nella maggior parte dei casi , gestirai solo lo spumeggiante . L'Anteprima sarebbe di solito usato per

  • blocco l'evento (e.Handled = true)
  • causa il genitore di fare qualcosa in anticipo alla normale gestione degli eventi.

esempio se UI Albero = Tasto contiene griglia contiene Tela contiene Ellipse
Cliccando sul dell'ellisse si tradurrebbe in (MouseDownButton è divorato da Button e fare clic viene generato invece.

+0

Grazie, ho cercato dappertutto in MSDN ma non l'ho trovato, ho letto tutti che parlavano di bolle e tunneling ma questo pezzo di testo mancava ovunque. –

3

Fondamentalmente, è lo stesso evento ma si verifica subito prima dell'evento principale. Esistono così puoi ascoltare quei tipi di eventi senza interferire con il normale comportamento del controllo quando si verificano quegli eventi.

Ad esempio, i pulsanti fanno le cose quando fai clic o MouseEnter, ecc. Se gestisci tu stesso quegli eventi devi assicurarti di fare le stesse cose altrimenti il ​​tuo pulsante non agirà allo stesso modo. Gli eventi di anteprima ti danno un evento nella stessa timeline senza doversi preoccupare di fare confusione con le funzionalità esistenti.

Ciò è particolarmente utile quando si tratta di stili/trigger/modelli di controllo personalizzati. Quando inizi a sovrascrivere l'aspetto/comportamento del controllo.

Quindi nel tuo controllo, fare il lavoro principale che si desidera in caso OnKeyDown e lasciare l'evento di anteprima per qualcun altro da usare, è come io lavoro con loro.

7

ho trovato questo blog davvero utile per descrivere la differenza:

http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/

avete la struttura visiva, quando si verifica un evento su un elemento nell'albero, prima un evento di anteprima viaggerà dal root to the element (tunneling): l'evento PreviewKeyDown verrà generato su tutti questi elementi, quindi un evento "normale" passerà dall'elemento alla radice (bubbling).

3

Questa differenza ha a che fare con gli eventi indirizzati, ovvero come WPF implementa la propria strategia di gestione degli eventi. Il nome dell'evento standard (ad es. KeyDown, ecc.) Implica una strategia di routing gorgogliante. Quelli preposti con "Anteprima" (ad esempio PreviewKeyDown, ecc.) Implicano una strategia di routing di tunneling. Puoi leggere su queste strategie in maggior dettaglio here. Fondamentalmente, quando viene invocato un evento in WPF, passa prima dall'elemento più in alto lungo l'albero visivo all'elemento che ha invocato l'evento e infine torna verso l'alto. Durante la discesa dell'albero, si verificherà l'evento PreviewKeyDown e durante il viaggio di ritorno si verificherà l'evento KeyDown, in tale ordine.

Problemi correlati