2010-08-04 5 views

उत्तर

18

एक विंडो की कल्पना करें जिसमें बाल नियंत्रण का घना पदानुक्रम है। अब मान लें कि आप कुछ करना चाहते हैं, आपकी खिड़की में कहीं भी दायाँ क्लिक करें।

  • सामान्य घटनाओं के साथ, आपको सभी नियंत्रणों के लिए एक क्लिक ईवेंट को संभालना होगा, क्योंकि आप सुनिश्चित नहीं हैं कि उपयोगकर्ता कहां क्लिक कर सकता है।
  • WPF के routed events के साथ, घटनाएं या तो "बबल" या "सुरंग" (यानी यूआई पेड़ या नीचे यात्रा करती हैं) यदि उन्हें कोई ईवेंट हैंडलर नहीं मिलता है, जो वर्तमान स्तर पर "हैंडल" करता है। तो आप खिड़की की घटना के लिए एक हैंडलर लिख सकते हैं यानी टॉपलेवल। (डब्ल्यूपीएफ में इवेंट जोड़े, पूर्वावलोकन XXX और XXX का एक सम्मेलन है - पूर्वावलोकन XXXX घटना पहले और सुरंगों को रूट से नीचे नियंत्रित करती है जो उत्तेजना और समकक्ष XXX घटना प्राप्त करती है, फिर रूट पर वापस बाल नियंत्रण से बुलबुले होते हैं)। तो अगर आप सही एक बटन क्लिक करें, WPF यूआई पदानुक्रम ऊपर यात्रा करता है, कि यह पाता है सभी संचालकों लागू (जब तक कि कोई निशान घटना "संभाला" है घटना args में।)
+0

पूर्वावलोकन घटनाओं, सुरंग हैं बुदबुदाती नहीं। –

+1

@ जॉन - ओह! मेरा डब्ल्यूपीएफ थोड़ा जंगली हो गया है। सुधार के लिए धन्यवाद ... अद्यतन। – Gishu

1

भेजा गया घटनाओं और अधिक के साथ घटनाओं रहे हैं ' यात्रा क्षमताओं ', जैसा कि गिशू के उत्तर में उल्लिखित है। कराई घटनाओं एक RoutedEvent वर्ग + साधारण नेट ईवेंट की घटना है, जो यह लपेटता का प्रतिनिधित्व कर रहे:

public class MyClassWithARoutedEvent : UIElement 
    { 
     public static readonly RoutedEvent DoSomethingEvent; 

     public event RoutedEventHandler DoSomething 
     { 
      add { base.AddHandler (MyClassWithARoutedEvent.DoSomethingEvent, value); 
      remove { base.AddHandler (MyClassWithARoutedEvent.DoSomethingEvent, value); 
     } 
    } 

आप आमतौर पर ऐसी स्थितियों में टाल दिया घटनाओं का प्रयोग करेंगे:

  • अपने स्वयं के नियंत्रण को लागू जो मूल WPF के आधारभूत संरचना
  • प्रोसेसिंग ईवेंट, एक सामान्य रूट
  • तत्व तत्व पेड़ में तत्वों के बीच संचार का क्रमबद्ध करें अधिकांश स्थितियों में आप wil मैं शायद इसे देखे बिना रूटेड इवेंट इंफ्रास्ट्रक्चर का उपयोग करता हूं।

इसके अतिरिक्त यह उल्लेख करने योग्य है कि आप अपने नियंत्रण में रूटेडएवेंट का उपयोग कर सकते हैं भले ही यह इसे परिभाषित न करे या यहां तक ​​कि किसी तत्व से विरासत में न हो। ऐसा इसलिए है क्योंकि आप वास्तव में किसी ईवेंट के मजबूत टाइप किए गए नाम के रूप में रूटेडएवेंट उदाहरण के बारे में सोच सकते हैं। तो, आप इस 'नाम' (यही कारण है कि एक कराई ईवेंट की घटना आम तौर पर सार्वजनिक किया जाता है) के लिए एक पहुँच है या नहीं, आप इसे देना कर सकते हैं:

public class MyClassWithARoutedEvent : UIElement 
    { 
     public static readonly RoutedEvent ClickEvent; 
     static MyClassWithARoutedEvent () 
     { 
      ClickEvent = ButtonBase.ClickEvent.AddOwner(typeof (MyClassWithARoutedEvent)); 
     } 

     // A wrapper should be placed here as described above 
    } 
संबंधित मुद्दे