2012-01-16 4 views
7

क्या WeakEventManager का उपयोग करके एक स्थिर घटना पर एक कमजोर ईवेंट श्रोता बनाना संभव है?एक स्थिर घटना के साथ WeakEventManager का उपयोग

मैं स्थैतिक संरचना लक्ष्य पर एक कमजोर घटना श्रोता बनाना चाहता हूं। जब मैं डब्ल्यूपीएफ/सिल्वरलाइट स्रोत तत्व के जीवनकाल को नहीं जानता तो स्मृति रिसाव से बचने के लिए कार्यक्रम प्रस्तुत करना।

मैं weak event pattern द्वारा प्रतिपादन इवेंट मैनेजर कार्यान्वित:

public class RenderingEventManager : WeakEventManager 
{ 
    public static void AddListener(IWeakEventListener listener) 
    { 
     CurrentManager.ProtectedAddListener(null, listener); 
    } 

    public static void RemoveListener(IWeakEventListener listener) 
    { 
     CurrentManager.ProtectedRemoveListener(null, listener); 
    } 

    private static RenderingEventManager CurrentManager 
    { 
     get 
     { 
      var managerType = typeof(RenderingEventManager); 
      var manager = (RenderingEventManager)GetCurrentManager(managerType); 
      if (manager == null) 
      { 
       manager = new RenderingEventManager(); 
       SetCurrentManager(managerType, manager); 
      } 
      return manager; 
     } 
    } 

    protected sealed override void StartListening(object source) 
    { 
     CompositionTarget.Rendering += this.OnCompositionTargetRendering; 
    } 

    protected sealed override void StopListening(object source) 
    { 
     CompositionTarget.Rendering -= this.OnCompositionTargetRendering; 
    } 

    void OnCompositionTargetRendering(object sender, EventArgs e) 
    { 
     this.DeliverEvent(sender, e); 
    } 
} 

और एक साधारण विंडो में प्रबंधक का परीक्षण किया:

public partial class Window1 : Window, IWeakEventListener 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     RenderingEventManager.AddListener(this); 
    } 

    bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e) 
    { 
     return true; 
    } 
} 

ReceiveWeakEvent विधि नहीं बुलाया जा रहा है। OnCompositionTargetRendering को कॉल किया जाता है, लेकिन ऐसा लगता है जैसे DeliverEvent मुझे अपेक्षित काम नहीं करता है। श्रोताओं को उदाहरण घटनाओं जैसे बटन पर जोड़ना। क्लिक ठीक है ... परीक्षण प्रोजेक्ट .NET 4.0 क्लाइंट प्रोफ़ाइल पर है।

A post on Microsoft Connect from 2009 कहा गया है कि स्थिर घटनाओं समर्थित नहीं हैं, लेकिन मैं WeakEventManager स्रोत कोड की जाँच की, और यह ठीक लग रहा है:

protected void ProtectedAddListener(object source, IWeakEventListener listener) 
    { 
     Debug.Assert(listener != null, "Listener cannot be null"); 

     object sourceKey = (source != null) ? source : StaticSource; 
     ... 
    } 

उत्तर

7

यह पता चल अपने आप: के लिए DeliverEvent विधि के इस तर्क बदल शून्य:

void OnCompositionTargetRendering(object sender, EventArgs e) 
{ 
    this.DeliverEvent(null, e); 
} 
संबंधित मुद्दे