2012-01-16 8 views
7

WeakEventManager kullanarak statik bir olayda zayıf olay dinleyicisi oluşturmak mümkün mü?WeakEventManager öğesinin statik bir olay ile kullanılması

WPF/Silverlight kaynak öğesinin ömrünü bilmediğimde bellek sızıntılarını önlemek için statik BileşimTarget.Rendering olayında zayıf bir olay dinleyicisi oluşturmak istiyorum.

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); 
    } 
} 

ve basit bir pencerede yöneticisi test:

Ben weak event pattern tarafından render olay yöneticisi uygulanan
public partial class Window1 : Window, IWeakEventListener 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     RenderingEventManager.AddListener(this); 
    } 

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

ReceiveWeakEvent yöntemi

çağrılan değil. OnCompositionTargetRendering çağrılır, ancak beklediğim gibi DeliverEvent çalışmaz gibi görünüyor. Button gibi örnek olaylara dinleyici ekleme. İyi çalışıyor ... Test projesi .NET 4.0 İstemci Profili üzerindedir.

A post on Microsoft Connect from 2009

statik olaylar desteklenmez, ama WeakEventManager kaynak kodunu kontrol belirtiyor ve ok görünüyor: için DeliverEvent yönteminin gönderen argüman değiştirin:

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

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

cevap

7

Kendim çözdü null:

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