2010-08-04 13 views

risposta

18

Immaginate una finestra che contiene una fitta gerarchia dei controlli figlio. Ora diciamo che vuoi fare qualcosa, c'è un clic destro in qualsiasi punto della tua finestra.

  • Con eventi normali, dovresti gestire un evento Click per tutti i controlli, perché non sei sicuro di dove l'utente possa fare clic.
  • Con WPF routed events, gli eventi "bolla" o "tunnel" (es. Viaggiano sull'albero dell'interfaccia utente o verso il basso) se non trovano un gestore di eventi che "lo gestisce" al livello corrente. Quindi potresti scrivere un gestore per l'evento della finestra, ad esempio TopLevel. (WPF ha una convenzione di coppie di eventi, PreviewXXX e XXX - l'evento PreviewXXX primo e tunnel scorrimento dalla radice per controllare che ha ricevuto lo stimolo e l'evento controparte XXX bolle poi dal controllo bambino indietro fino Root). Quindi, se si fa clic destro su un pulsante, WPF viaggia nella gerarchia dell'interfaccia utente, invocando tutti i gestori che trova (a meno che qualcuno segna l'evento è "gestito" nelle args evento.)
+0

Preview sono tunneling, non spumeggiante. –

+1

@John - Oops! il mio wpf è diventato un po 'arrugginito. Grazie per la correzione ... aggiornata. – Gishu

1

eventi indirizzati sono eventi con piu ' abilità viaggia, come indicato nel risposta un di Gishu. eventi indirizzati sono rappresentati da un'istanza di una classe RoutedEvent + evento ordinario NET, che lo avvolge:

public class MyClassWithARoutedEvent : UIElement 
    { 
     public static readonly RoutedEvent DoSomethingEvent; 

     public event RoutedEventHandler DoSomething 
     { 
      add { base.AddHandler (MyClassWithARoutedEvent.DoSomethingEvent, value); 
      remove { base.AddHandler (MyClassWithARoutedEvent.DoSomethingEvent, value); 
     } 
    } 

viene in genere utilizzato eventi propagandato in queste situazioni:

  • implementare il proprio controllo, che senza soluzione di continuità si integra con l'infrastruttura WPF
  • Eventi di elaborazione, attivati ​​da diversi controlli su una radice comune
  • Ordinamento delle comunicazioni tra gli elementi in un albero degli elementi Nella maggior parte dei casi si verificano Probabilmente userò l'infrastruttura di eventi instradati senza nemmeno accorgercene.

Inoltre, vale la pena menzionare che è possibile utilizzare RoutedEvent nel proprio controllo anche se non lo definisce né eredita da un elemento. Questo perché si può davvero pensare a un'istanza RoutedEvent come un forte nome digitato di un evento. Quindi, se si dispone di un accesso a questo 'nome' (questo è il motivo per cui un esempio di un evento indirizzato è di solito reso pubblico), è possibile doverla: eventi

public class MyClassWithARoutedEvent : UIElement 
    { 
     public static readonly RoutedEvent ClickEvent; 
     static MyClassWithARoutedEvent () 
     { 
      ClickEvent = ButtonBase.ClickEvent.AddOwner(typeof (MyClassWithARoutedEvent)); 
     } 

     // A wrapper should be placed here as described above 
    } 
Problemi correlati