2010-03-04 7 views
9

La letteratura è orribile in questo senso: tutto ciò che voglio fare è creare un evento da un controllo che ho definito ma creato al volo (speriamo che questo non causi problemi) da una classe di controller di broker. Il controllo è un PopUp.Stumped - gorgogliare un routedevent fino alla finestra in alto in WPF - come catturare ovunque!

public static readonly RoutedEvent weClosed = EventManager.RegisterRoutedEvent("TIMBOO", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(FixedTaskbarNotifier)); 


    // Provide CLR accessors for the event 
    public event RoutedEventHandler TIMBOO 
    { 
     add { AddHandler(weClosed, value); } 
     remove { RemoveHandler(weClosed, value); } 
    } 

    // This method raises the Tap event 
    void RaiseTapEvent() 
    { 
     RoutedEventArgs newEventArgs = new RoutedEventArgs(weClosed); 
     RaiseEvent(newEventArgs);} 


    protected override void OnClosed(EventArgs e) 
    { 
     //TO DO - rearrange current open windows - fire event? 
     Log.Instance.Info("Clean up Window"); 
     RaiseTapEvent(); This is called on close but nothing fires .. 
       } 

Spero di catturare l'evento da qualche parte, anche nella finestra principale o superiore dell'albero visivo. Questo ha un riferimento a un controller che contiene l'elenco dei controlli di notifica -quando so che è stato chiuso, posso reoganizzare/ridisegnare tutti gli altri ancora attivi tramite il controller, ma come catturare? Grazie!

risposta

2

Sul tuo genitore, o dovunque desideri gestirlo, dovresti semplicemente essere in grado di gestire l'evento dichiarando quale classe è dichiarata e il nome dell'evento. Nel tuo caso, sulla vostra dichiarazione della finestra, fare:

<Window ... FixedTaskbarNotifier.TIMBOO="<EventHandlerName>"> 

Ciò catturare tutti gli eventi gorgogliare up che non sono stati cancellati (e si può anche ottenere quelle, se si vuole, anche se credo che non è considerato un buona pratica).

Come semplice esempio, creare una finestra e posizionare un pulsante su di essa. Nella finestra, aggiungere un gestore per l'operazione di scatto (che è definito sulla ButtonBase)

<Window ... ButtonBase.Click="Window_Click"> 

Questo sarà poi il fuoco in qualsiasi momento qualsiasi pulsante bambino viene cliccato, anche all'interno dei controlli figlio e così, a meno che l'evento è volutamente annullato.

4

Sono d'accordo, la documentazione sul bubbling/tunneling su MSDN non è affatto eccezionale.

Ho trovato questo articolo della rivista MSDN "Understanding Routed Events and Commands In WPF" molto meglio a spiegare gli eventi di bubbling.

Cercare la sezione "Evento Routing", la copia incollato qui sotto:

evento Routing

Capire un po circa gli alberi logici e visivi è importante perché gli eventi indirizzati ottenere instradati basa principalmente sull'albero visivo . Gli eventi instradati supportano una RoutingStrategia di Bubble, Tunnel o diretta.

Bubble è il più comune e significa che un evento si bolla (propagazione) sull'albero visiva dell'elemento sorgente fino a quando è stato manipolato o raggiunge la radice elemento. Ciò consente di gestire un evento su un oggetto più in alto nella gerarchia di elementi dall'elemento source . Ad esempio, è possibile allegare un gestore Button.Click sullo che include l'elemento Grid anziché direttamente sul pulsante stesso. Gli eventi Bubble hanno solo nomi che indicano la loro azione (ad esempio MouseDown).

eventi Tunnel vanno nell'altra direzione , a partire dalla radice elemento e attraversando l'albero elemento fino a quando non sono gestite o raggiungono l'elemento di origine per l'evento . Ciò consente agli elementi a monte di intercettare l'evento e gestirlo prima che l'evento raggiunga l'elemento di origine. Gli eventi di tunnel hanno i loro nomi con prefisso Anteprima di (ad esempio PreviewMouseDown).

Gli eventi diretti si comportano come normali eventi in .NET Framework. L'unico gestore potenziale per l'evento è un delegato collegato all'evento .

In genere se un evento Tunnel è definito come per un particolare evento, lì è un evento Bubble corrispondente. Nel caso , l'evento Tunnel genera prima , iniziando dalla radice e fino all'elemento di origine in cerca di un gestore. Una volta che il numero è stato gestito o ha raggiunto l'elemento di origine , l'evento Bubble è attivato, risalendo dall'elemento di origine e cercando un gestore . Un evento Bubble o Tunnel fa sì che non interrompa il routing solo perché viene chiamato un gestore di eventi . Se si vuole per fermare il bolle o tunneling processo, si contrassegna l'evento come gestito nel vostro gestore di eventi utilizzando l'evento argomenti si sono passati:

private void OnChildElementMouseDown(object sender, MouseButtonEventArgs e) { e.Handled = true; } 

Una volta che il gestore segna un evento come gestito, non verrà aumentato a nessun altro gestore . Bene, questo è solo parzialmente vero. In realtà, l'evento di routing continua dietro le quinte, e si può collegare in modo esplicito di eventi gestori in codice con un override del metodo UIElement.AddHandler che ha una bandiera addizionale efficacemente dire, "Call me, anche se il l'evento ha contrassegnato come gestito. " Si specifica quella bandiera con una chiamata come il seguente:

m_SomeChildElement.AddHandler(UIElement.MouseDownEvent, (RoutedEventHandler)OnMouseDownCallMeAlways,true); 

Il primo parametro da AddHandler è il RoutedEvent si desidera gestire. Il secondo è un delegato al metodo di gestione degli eventi (che avrà bisogno di per ottenere la firma corretta per il delegato dell'evento ). Il terzo parametro indica se si desidera essere notificato anche se un altro gestore ha contrassegnato come evento gestito. L'elemento su cui si chiama AddHandler è quello che guarderà per l'evento da scorrere durante il routing.

Spero che questo aiuti.

Problemi correlati