2012-01-09 7 views
5

Come ottenere l'elenco dei delegati dall'evento del controllo in WPF.Come ottenere l'elenco di chiamata di qualsiasi evento

Ho provato il seguente codice ma ritornerò informazioni campo nullo

TextBox cont = new TextBox(); 
cont.TextChanged += new TextChangedEventHandler(cont_TextChanged); 
FieldInfo fi = cont.GetType().GetField("TextChanged", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.Public | BindingFlags.Static); 
Delegate del = (Delegate)fi.GetValue(cont); 
+0

possibile duplicato di [Come posso ottenere un elenco dei delegati sottostanti da un evento utilizzando la riflessione?] (Http://stackoverflow.com/questions/6501288/how-can-i -get-a-list-of-the-underlying-delegates-from-an-event-using-reflection) – Heinzi

risposta

5

non so perché la gente dice che non è possibile:

Diciamo che si desidera disattivare qualsiasi evento temporaneo , è possibile creare un metodo come questo:

static Delegate[] DisableEvents(this Control ctrl, string eventName) 
{ 
     PropertyInfo propertyInfo = ctrl.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); 
     EventHandlerList eventHandlerList = propertyInfo.GetValue(ctrl, new object[] { }) as EventHandlerList; 
     FieldInfo fieldInfo = typeof(Control).GetField("Event"+eventName, BindingFlags.NonPublic | BindingFlags.Static); 

     object eventKey = fieldInfo.GetValue(ctrl); 
     var eventHandler = eventHandlerList[eventKey] as Delegate; 
     Delegate[] invocationList = eventHandler.GetInvocationList(); 
     foreach (EventHandler item in invocationList) 
     { 
      ctrl.GetType().GetEvent(eventName).RemoveEventHandler(ctrl, item); 
     } 
     return invocationList; 

}| 

si può chiamare in questo modo:

var events = textbox1.DisableEvents("GotFocus") 

Se si desidera aggiungerli di nuovo, è sufficiente scorrere l'elenco degli eventi.

+0

Cosa intendi in questa frase finale, "passa alla lista degli eventi"? –

+0

Intendevo dire che è possibile iterare l'elenco che si è ottenuto nel metodo DisableEvents e aggiungere di nuovo quegli eventi. Ma in realtà ora c'è un modo più semplice per farlo ed è chiamando GetInvocationList per recuperare tutti i delegati. –

+0

Funziona per me! Testato con semplice evento Control.Click. +1 – Alex

0

L'approccio descritto nella risposta precedente funziona perfettamente. Tuttavia, per usarlo, è necessario essere sicuri che l'evento non sia implementato come un campo, ma come una proprietà. Allo stesso tempo, il riferimento al delegato viene memorizzato nell'oggetto interno della classe Dizionario. Puoi leggere di più qui: How to: Use a Dictionary to Store Event Instances (C# Programming Guide)

Problemi correlati