2011-10-23 13 views
6

एक कस्टम रूटेड घटना से कैसे पंजीकरण करें।डब्ल्यूपीएफ कस्टम रूटेड घटनाक्रम - सदस्यता छोड़ने के लिए कैसे?

मैं निम्नलिखित कोड (के लिए कस्टम कराई घटनाक्रम बहुत मानक)

//Dispatch the Video Detection Movements 
public delegate void MovementRoutedEventHandler(object sender 
               , MovementRoutedEventArgs e); 
public class MovementRoutedEventArgs : RoutedEventArgs 
{ 
    private readonly DahuaDevice _device; 
    private readonly byte[] _canals; 
    private readonly DateTime _when; 

    public MovementRoutedEventArgs(DahuaDevice device, byte[] canals, DateTime when) 
    { 
     _device = device; 
     _canals = canals; 
     _when = when; 
    } 
    public DahuaDevice Device 
    { 
     get { return _device; } 
    } 
    public Byte[] Canals 
    { 
     get { return _canals; } 
    } 
    public DateTime When 
    { 
     get { return _when; } 
    } 
} 
public static RoutedEvent MovementEvent = EventManager.RegisterRoutedEvent(
     "Movement" 
    , RoutingStrategy.Tunnel 
    , typeof(MovementRoutedEventHandler) 
    , typeof(Window) 
); 

public event RoutedEventHandler Movement 
{ 
    add { AddHandler(MovementEvent, value); } 
    remove { RemoveHandler(MovementEvent, value); } 
} 
public void RaiseMovementEvent(DahuaDevice device, byte[] canals, DateTime when) 
{ 
    RaiseEvent(new MovementRoutedEventArgs(device, canals, when) 
    { 
     RoutedEvent = MovementEvent 
    }); 
} 

अब एक वर्ग इस लाइन के साथ इस घटना की सदस्यता होगा:

//Receive the Movement events 
EventManager.RegisterClassHandler( 
     typeof(Window) 
    , Main.MovementEvent 
    , new Main.MovementRoutedEventHandler(MovementHandler)); 

जब मैं कक्षा उदाहरण बंद करते हैं, मुझे घटना से सदस्यता छोड़ना चाहिए (अन्यथा, उदाहरण कचरा नहीं होगा)।

मुझे क्या कॉल करना चाहिए? मैंने RegisterClassHandler(typeof(Window), Main.MovementEvent, **null**) की कोशिश की लेकिन मुझे अपवाद मिला ...

कोई भी सहायता आपका स्वागत है। अग्रिम में धन्यवाद।

जेएम

उत्तर

9

आप System.Windows.Window क्लास (आमतौर पर UIElement क्लास से) RemoveHandler विधि का उपयोग कर सकते हैं।

कोड कुछ इस तरह दिखाई दे सकता है:

Main.RemoveHandler(Main.MovementEvent 
        , new Main.MovementRoutedEventHandler(MovementHandler)); 
+0

त्वरित उत्तर के लिए बहुत बहुत धन्यवाद। –

+0

खुशी है कि मैं आपकी मदद करने में सक्षम था। –

5

मुझे यकीन है कि अगर मैं पूरी तरह से समझते हैं कि आप क्या कर रहे हैं नहीं कर रहा हूँ, लेकिन मैं अपने दो सेंट में फेंक देंगे।

आपका EventManager.RegisterClassHandler कॉल को अपनी कक्षा के लिए एक स्थिर निर्माता में रखा जाना चाहिए, जिसे आप पंजीकृत करना चाहते हैं। यह कक्षा के आपके सभी उदाहरणों पर लागू होगा और कचरा संग्रह को प्रभावित नहीं करना चाहिए।

आप रजिस्टर बनाने के लिए/एक उदाहरण प्रति स्तर पर इस घटना के लिए अपंजीकृत चाहते हैं, तो पारंपरिक

myEvent += myDelegate; 
myEvent -= myDelegate; 

आशा इस मदद करता है का उपयोग करें।

+0

जवाब के लिए धन्यवाद, लेकिन यू सीधे + और उपयोग कर सकते हैं - जब वे कर रहे हैं "कस्टम घटनाक्रम भेजा गया" ... मुझे यकीन है कि नहीं हूँ। मेमोरी लीक से बचने के लिए मैं एक स्थिर कन्स्ट्रक्टर में RegisterClassHandler डाल दूंगा। –

+0

हां आप कस्टम रूटेड घटनाओं के लिए + और - का उपयोग कर सकते हैं। इन्हें एक आवृत्ति स्तर पर उपयोग किया जाता है, हालांकि आपका समाधान कक्षा के सभी उदाहरणों को घटना की सदस्यता लेने के लिए प्रतीत होता है, EventManager.RegisterClassHandler जाने का तरीका है। हालांकि यह भी ध्यान रखना महत्वपूर्ण है कि घटना में पंजीकृत विधि स्थैतिक होनी चाहिए या अन्यथा आपको स्मृति रिसाव की समस्या मिलेगी जिसके बारे में आप चिंतित थे। इसे देखें [लिंक] (http://www.japf.fr/2009/08/wpf-memory-leak-with-eventmanager-registerclasshandler/) – philt5252

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