2012-01-16 27 views
7

Có thể tạo trình xử lý sự kiện yếu trên sự kiện tĩnh bằng WeakEventManager không?Sử dụng WeakEventManager với sự kiện tĩnh

Tôi muốn tạo trình xử lý sự kiện yếu trên sự kiện CompositionTarget.Rendering tĩnh để tránh rò rỉ bộ nhớ khi tôi không biết tuổi thọ của phần tử nguồn WPF/Silverlight.

tôi thực hiện quản lý sự kiện vẽ bởi 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); 
    } 
} 

và thử nghiệm quản lý trong một cửa sổ đơn giản:

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

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

Phương pháp ReceiveWeakEvent không được gọi. OnCompositionTargetRendering được gọi, nhưng có vẻ như DeliverEvent không hoạt động như tôi mong đợi. Thêm người nghe vào các sự kiện ví dụ như Button.Click hoạt động tốt ... Dự án thử nghiệm nằm trên Hồ sơ khách hàng .NET 4.0.

A post on Microsoft Connect from 2009 khẳng định rằng sự kiện tĩnh không được hỗ trợ, nhưng tôi đã kiểm tra mã nguồn WeakEventManager, và có vẻ ok:

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

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

Trả lời

7

đặn nó ra bản thân mình: thay đổi gửi đối số của phương pháp DeliverEvent để null:

void OnCompositionTargetRendering(object sender, EventArgs e) 
{ 
    this.DeliverEvent(null, e); 
} 
Các vấn đề liên quan