2011-02-05 11 views
8

मैं कुछ डब्ल्यूपीएफ विशिष्ट सामानों के आस-पास अपने सिर को लपेटने की कोशिश कर रहा हूं, और अभी तक UIElement.AddHandler विधि और EventManager.RegisterClassHandler विधि के बीच ठोस संबंध ढूंढना है।डब्ल्यूपीएफ में कक्षा श्रोता और एक इंस्टेंस श्रोता के बीच क्या अंतर है?

मैं थोड़ा googled और इस दिलचस्प MSDN लेख पाया है:

http://msdn.microsoft.com/en-us/library/ms747183.aspx

यहाँ यह कहा गया है: वर्ग श्रोताओं और उदाहरण:

"कराई घटनाओं घटना के लिए श्रोताओं के दो अलग अलग प्रकार पर विचार श्रोताओं। कक्षा श्रोताओं का अस्तित्व मौजूद है क्योंकि प्रकारों ने अपने स्थिर कन्स्ट्रक्टर में एक विशेष EventManager API, RegisterClassHandler को कॉल किया है, या तत्व बेस क्लास से क्लास हैंडलर आभासी विधि को ओवरराइड किया है। इंस्टेंस श्रोताओं विशेष श्रेणी के उदाहरण/तत्व हैं जहां एक या अधिक हैंडलर उस रूटेड घटना के लिए एडहैंडलर को कॉल करके संलग्न किया गया है। "

ठीक है तो मुझे कक्षा और उसके उदाहरण के बीच का अंतर पता है, लेकिन किसी भी तरह से मैं दस्तावेज़ के इस विशिष्ट भाग से समझ नहीं पा रहा हूं।

क्या कोई इसे मेरे लिए साफ़ कर सकता है?

उत्तर

11

मुझे नहीं पता, आप वास्तव में क्या जानना चाहते हैं। चीजें बहुत सरल हैं: आप उदाहरण (ऑब्जेक्ट) स्तर पर, या कक्षा स्तर पर हैंडलर पंजीकृत कर सकते हैं।

अंतर यह है कि, जब आप कक्षा स्तर पर ईवेंट पंजीकृत करते हैं, तो यह किसी भी इंस्टेंस लेवल हैंडलर (निश्चित रूप से टनलिंग या बुलबुले अभी भी पहले होता है, यदि कक्षा को लॉजिकल पेड़ में कम/उच्च है) से पहले कहा जाता है। तो आप कक्षा के स्तर पर इस घटना को संभाल सकते हैं और फ़िल्टर कर सकते हैं कि इस घटना को उदाहरण के द्वारा संभाला जाना चाहिए या नहीं (e.Handled = true सेट करके आप अन्य हैंडलर के माध्यम से जाने के लिए ईवेंट रोक देंगे)। यह कुछ मामलों में उपयोगी हो सकता है, लेकिन अभी मेरे पास साझा करने के लिए मेरे दिमाग में कोई उदाहरण नहीं है।

यह नमूना ईवेंट हैंडलर पंजीकृत करेंगे कि केवल कॉल किया जाएगा घटना तत्व के विशिष्ट उदाहरण के लिए उठाया गया था:

DockPanel panel = new DockPanel(); 
panel.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click)); 

और यह पैदा करेगा ईवेंट हैंडलर, कि हर बार किसी भी DockPanel बटन मिल जाएगा बुलाया जाएगा इस DockPanel के कहने हैंडलर से पहले .Click घटना, कहा जाता हो जाएगा:

EventManager.RegisterClassHandler(typeof(DockPanel), 
    Button.ClickEvent, new RoutedEventHandler(ButtonClass_Click)); 

हैं तरीकों थे:

private void ButtonClass_Click(object sender, RoutedEventArgs e) 
{ 
    Debug.Write("Class level handler"); 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Debug.Write("Instance level handler"); 
} 

यह पैदा करेगा उत्पादन:

कक्षा के स्तर का हैंडलर
उदाहरण के स्तर का हैंडलर

लेकिन अगर श्रेणी स्तर हैंडलर में आप handeled को (e.Handled = true;) घटना args स्थापित करेगा, यह फ़िल्टर हो जाएंगे उदाहरण के लिए हैंडलर (और तार्किक पेड़ में बुलबुले) के लिए इस घटना को बाहर करें।

+0

यह वही था जो मैं जानना चाहता था और वाक्य "और यह इवेंट हैंडलर बनाएगा, जिसे प्रत्येक बार डॉकपैनल बटन मिलेगा। घटना पर क्लिक करें ...." यह स्पष्ट किया कि मेरे विचार में त्रुटि था :) – UrbanEsc

+0

मैं हमेशा मदद करने में खुश हूँ :) – Pako

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