2012-01-09 16 views
5

WPF'de denetimin temsilci listesi form olayı nasıl alınır.Herhangi bir olayın çağrı listesi nasıl elde edilir

Aşağıdaki kodu denedi ama o kadar boş alan bilgisi dönecektir

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

olası bir kopyası [Yansıtmayı kullanan bir olaydaki temel delegelerin listesini nasıl alabilirim?] (Http://stackoverflow.com/questions/6501288/how-can-i -get-of-the-the-the-the-the-the-yatan-delegeler-olay-kullanarak-yansıma) – Heinzi

cevap

5

İnsanların bu mümkün değil demek niye bilmiyorum:

geçici türlü etkinliğe devre dışı istiyorsunuz diyelim

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; 

}| 

böyle diyebilirsin:

, böyle bir yöntemi oluşturabilir
var events = textbox1.DisableEvents("GotFocus") 

Tekrar eklemek isterseniz, olaylar listesinden geçmeniz yeterlidir.

+0

Bu son cümlede ne demek istiyorsun, "sadece olaylar listesi üzerinden gitmek"? –

+0

DisableEvents yönteminde bulduğunuz listeyi yineleyebilir ve bu olayları tekrar ekleyebilirsiniz. Ama aslında şimdi bunu yapmanın en kolay yolu var ve tüm delegeleri almak için GetInvocationList'i arıyor. –

+0

Benim için çalışıyor! Basit Control.Click olayıyla test edildi. +1 – Alex

0

Önceki cevapta açıklanan yaklaşım mükemmel çalışır. Ancak, kullanmak için, olayın bir alan olarak değil, bir özellik olarak uygulandığından emin olmanız gerekir. Aynı zamanda, temsilci referansı, Dictionary sınıfının iç nesnesinde saklanır.Daha fazla bilgiyi buradan edinebilirsiniz: How to: Use a Dictionary to Store Event Instances (C# Programming Guide)

İlgili konular