2010-12-17 15 views
6

मैं एक WinForm winform1 और 2 उपयोगकर्ता को नियंत्रित करता है इस फार्मसी # में एक वैश्विक कस्टम घटना लेखन

अब मैं जो उठाया है एक कस्टम घटना, परिभाषित करना चाहते हैं पर Control1 और Control2 है/नियंत्रण 1 में निकाल दिया गया और नियंत्रण 2 में प्राप्त हुआ। कार्यक्रम वैश्विक होना चाहिए और सीधे नियंत्रण 1 में परिभाषित नहीं होना चाहिए। नियंत्रण 2 नियंत्रण 1 के अस्तित्व के बारे में नहीं पता होना चाहिए। घटना को अन्य नियंत्रणों द्वारा भी उठाया जाना चाहिए। उसके लिए सी # कोड कैसा है? क्या मुझे प्रकाशक वर्ग की तरह कुछ चाहिए?

उत्तर

8

आप जो वर्णन करते हैं वह Mediator pattern जैसा दिखता है, जिसमें वस्तुओं संदेश के माध्यम से संवाद करती हैं। इन संदेशों को घटनाओं, कॉलबैक, या किसी अन्य तंत्र के रूप में लागू किया जा सकता है।

आप MVVM Light के Messenger वर्ग की तरह एक कार्यान्वयन इस्तेमाल कर सकते हैं (इस ढांचे WPF और Silverlight के साथ प्रयोग के लिए बनाया गया है, लेकिन आप इस विशेष वर्ग के लिए कोड प्राप्त और WinForms में उपयोग कर सकते हैं)

// Register for a specific message type 
Messenger.Default.Register<TypeOfTheMessage>(this, DoSomething); 
... 

// Called when someone sends a message of type TypeOfTheMessage 
private void DoSomething(TypeOfTheMessage message) 
{ 
    // ... 
} 

// Send a message to all objects registered for this type of message 
Messenger.Default.Send(new TypeOfTheMessage(...)); 

एक स्थिर घटना पर Messenger वर्ग का एक बड़ा फायदा यह है कि यह कमजोर संदर्भों का उपयोग करता है, इसलिए यह सब्स्क्राइब्ड ऑब्जेक्ट्स के कचरा संग्रहण को रोकता नहीं है, जो स्मृति रिसाव के जोखिम को कम करता है।

Messenger वर्ग के बारे में जानकारी के लिए this link देखें

8

आप एक स्थिर घटना का उपयोग कर सकते हैं:

public static class MyGlobalEvent { 
    public static event EventHandler MyEvent; 

    public static void FireMyEvent(EventArgs args) 
    { 
     var evt = MyEvent; 
     if (evt != null) 
      evt(args); 
    } 
} 

हमेशा की तरह सदस्यता लें:

MyGlobalEvent.MyEvent += args => Console.WriteLine("Event Was Fired."); 

आग जो आपको योग्य के रूप में:

MyGlobalEvent.FireMyEvent(new EventArgs()); 
+4

यदि आप इस तरह से जाते हैं तो मेमोरी लीक से सावधान रहें ... ईवेंट अपने हैंडलरों के लिए मजबूत संदर्भ रखेगा, और यदि आप –

+0

सदस्यता रद्द नहीं करते हैं तो उन्हें एकत्रित होने से रोक देगा। ईवेंट में अपने हैंडलर के लिए मजबूत संदर्भ कैसे हैं ये मामला? क्या आप विस्तार से समझा सकते हैं? – AllSolutions

+0

@AllSolutions, क्योंकि परिभाषा के अनुसार ईवेंट हैंडलरों के संदर्भ में हैं। यह सिर्फ स्थिर घटनाएं स्थिर होने के बाद कभी भी गुंजाइश से बाहर नहीं जाती हैं, जबकि इंस्टेंस ईवेंट एकत्रित होने पर युक्त ऑब्जेक्ट के साथ गुंजाइश से बाहर हो जाता है। –

2

तो आप अपना फॉर्म प्रकाशक (और नियंत्रण के बीच मध्यस्थ) बना सकते हैं, और आपके सभी नियंत्रण ऐसे ग्राहक होंगे जिन्हें ईवेंट पर अधिसूचित किया जाएगा।

एक घटना नियंत्रण में हुई, फॉर्म अधिसूचित किया जाएगा और फॉर्म पर ईवेंट हैंडलर इस घटना की सदस्यता लेने वाले अन्य नियंत्रणों को सूचित करेगा।

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