2012-01-09 9 views
5

डब्ल्यूपीएफ में नियंत्रण सूची प्रतिनिधि सूची कैसे प्राप्त करें।किसी भी घटना की आमंत्रण सूची कैसे प्राप्त करें

मैं निम्नलिखित कोड की कोशिश की है, लेकिन यह क्षेत्र की जानकारी के रूप में अशक्त वापस आ जाएगी

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

संभावित डुप्लिकेट [मैं प्रतिबिंब का उपयोग करके किसी ईवेंट से अंतर्निहित प्रतिनिधियों की सूची कैसे प्राप्त कर सकता हूं?] (Http://stackoverflow.com/questions/6501288/how-can-i -ज-ए-लिस्ट-ऑफ-द-अंडरलिंग-प्रतिनिधि-से-एक-ईवेंट-उपयोग-प्रतिबिंब) – Heinzi

उत्तर

5

मैं जानता हूँ कि क्यों लोग कहते हैं कि यह संभव नहीं है न:

कहते हैं कि तुम किसी भी घटना अस्थायी अक्षम करना चाहते चलें

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; 

}| 

आप इस तरह यह कॉल कर सकते हैं:

, तो आप इस तरह एक विधि बना सकते हैं
var events = textbox1.DisableEvents("GotFocus") 

यदि आप उन्हें फिर से जोड़ना चाहते हैं तो आपको केवल ईवेंट सूची में जाना होगा।

+0

उस अंतिम वाक्य में आपका क्या मतलब है, "बस ईवेंट सूची के माध्यम से जाएं"? –

+0

मेरा मतलब था कि आप DisableEvents विधि में मिली सूची को पुन: सक्रिय कर सकते हैं और उन घटनाओं को फिर से जोड़ सकते हैं। लेकिन वास्तव में ऐसा करने का सबसे आसान तरीका है और सभी प्रतिनिधियों को पुनर्प्राप्त करने के लिए GetInvocationList को कॉल करके है। –

+0

मेरे लिए काम करता है! सरल नियंत्रण के साथ परीक्षण किया। घटना पर क्लिक करें। +1 – Alex

0

पिछले उत्तर में वर्णित दृष्टिकोण पूरी तरह से काम करता है। हालांकि, इसका उपयोग करने के लिए, आपको यह सुनिश्चित करने की आवश्यकता है कि ईवेंट को फ़ील्ड के रूप में लागू नहीं किया गया है, लेकिन एक संपत्ति के रूप में। साथ ही, प्रतिनिधि वर्ग का संदर्भ शब्दकोश वर्ग की आंतरिक वस्तु में संग्रहीत किया जाता है। आप यहां और अधिक पढ़ सकते हैं: How to: Use a Dictionary to Store Event Instances (C# Programming Guide)

संबंधित मुद्दे