2013-02-12 11 views
5

Ok, non riesco a trovare alcun aiuto per la mia domanda e stackoverflow non sembra avere nulla, o non sapevo come cercarlo (correggimi, se sbaglio e chiuderò questa domanda).Come trovare l'elenco degli eventi usando Debugger (VS Professional 2012)?

Nel mio programma, ho un Grid che ha pochi eventi definded in codice:

public Grid _grid = new Grid(); 
_grid.MouseLeftButtonDown += new MouseButtonEventHandler(MyMethod); 
//and a few more events... 

Ora durante la mia esecuzione del programma, ho visto un comportamento strano che può venire solo da alcuni eventi, così mi sono messo un punto di interruzione e ha interrotto il programma per utilizzare il debugger.

C'è una lista che posso trovare da qualche parte che elenca tutti gli eventi attualmente definiti del membro _grid in modo da poter verificare che non siano stati ancora rimossi eventi indesiderati?

risposta

4

Aggiorna 2

Sfortunatamente, la maggior parte degli eventi in WPF (cioè UIElement) sono implementati implementando manualmente add/remove ossia al membro evento può essere solo sul lato sinistro di una -= o += operatore (cioè non può essere "letto"). Gli interni sono tali che ogni evento è "delegato" a una raccolta di eventi e quella raccolta contiene solo elementi per gli eventi assegnati (ad esempio se c'è un singolo MouseLeftButtonDownEvent += somehandler; allora quella raccolta di eventi avrà solo una voce. Sfortunatamente, quale collezione di eventi gli archivi per rappresentare un gestore sono una struttura interna che dovresti essere in grado di creare un'istanza per interrogare la raccolta. Non puoi istanziare un'istanza di quella struttura (RoutedEventHandlerInfo, FWIW) per richiedere la raccolta (UIElement.EventHandlersStore._entries, anche FWIW) . ad esempio, se si potesse si, si potrebbe interrogare il gestore per un evento particolare, come ad esempio nella finestra Controllo immediato:.

grid.EventHandlersStore._entries[ 
    new RoutedEventHandlerInfo(UIElement.MouseLeftButtonDownEvent, false)] 

Ma, il debugger non consente di richiamare un costruttore interna 012.

Non c'è qualcosa che elenca solo gli eventi. Puoi vedere tutti i membri di un'istanza nel debugger (watch, quickwatch, ecc.) E gli eventi hanno un'icona distinta. È quindi possibile espandere ciascuno di questi per vedere quale metodo è stato assegnato all'evento. Per esempio:

enter image description here

Come si può vedere, MyEvent è stato "assegnato" il metodo t_MyEvent per questo caso particolare.

Aggiornamento: Se si dispone di più di un gestore di eventi assegnata a un evento, il debugger mostrerà solo l'ultimo metodo assegnato nel primo livello della manifestazione in vigilanza veloce. Per vedere tutti i metodi, è necessario eseguire il drill down nell'elenco di chiamate. Per esempio:

enter image description here

.. questo dimostra che sia t_MyEvent e t_MyEvent2 sono nella lista di invocazione per MyEvent. Se non si dispone di gestori, il valore per MyEvent sarà null.

+0

Grazie per la risposta. Quindi nel mio esempio dovrei essere in grado di vedere "MouseLeftButtonDown" da qualche parte quando espongo "_grid"? Sto cercando nella finestra "Locali", ma non riesco a vedere nulla ... – phil13131

+0

Forse hai più delegati assegnati all'evento, ho aggiornato la risposta per includere ... –

+0

Nel mio programma ne ho solo uno metodo assegnato ad ogni evento, ma alcuni metodi in totale che usano ad es 'MouseButtonEventHandler'. Stavo cercando invocationList ma non riesco a trovarlo. Mostreresti gentilmente il tuo esempio per una griglia 'WPF'? Forse è un po 'diverso lì. – phil13131

Problemi correlati