2012-01-16 8 views
7

¿Es posible crear un detector de eventos débiles en un evento estático usando WeakEventManager?Uso de WeakEventManager con un evento estático

Me gustaría crear un detector de eventos débiles en el evento estático CompositionTarget.Rendering para evitar pérdidas de memoria cuando no conozco la vida útil del elemento de fuente WPF/Silverlight.

que implementa el gestor de eventos prestación por el 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); 
    } 
} 

y probado el gerente en una ventana simple:

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

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

El método ReceiveWeakEvent no se está llamando. Se llama a OnCompositionTargetRendering, pero parece que DeliverEvent no funciona como esperaba. Agregar oyentes a eventos de instancia como Button.Click funciona bien ... El proyecto de prueba está en .NET 4.0 Client Profile.

A post on Microsoft Connect from 2009 afirma que los eventos estáticos no son compatibles, pero he comprobado el código fuente WeakEventManager, y se ve bien:

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

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

Respuesta

7

pensé que fuera a mí mismo: cambiar el emisor argumento del método DeliverEvent a nulo:

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