2012-01-16 14 views
7

WeakEventManagerを使用して静的イベントで弱いイベントリスナーを作成することはできますか?静的イベントでWeakEventManagerを使用する

静的なCompositionTarget.Renderingイベントに弱いイベントリスナーを作成して、WPF/Silverlightソース要素の有効期間がわからないときにメモリリークが発生しないようにしたいと考えています。

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

を、簡単なウィンドウにマネージャをテストした:ReceiveWeakEventメソッドが呼び出されていない

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

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

。 OnCompositionTargetRenderingが呼び出されましたが、期待通りにDeliverEventが機能しないようです。 テストプロジェクトは.NET 4.0クライアントプロファイルにあります。

A post on Microsoft Connect from 2009は、静的なイベントがサポートされていないと述べている が、私はWeakEventManagerのソースコードをチェックし、それがOKになります。

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

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

答えて

7

は自分自身をそれを考え出し:にDeliverEvent方法の送信者引数を変更しますnull:

void OnCompositionTargetRendering(object sender, EventArgs e) 
{ 
    this.DeliverEvent(null, e); 
} 
関連する問題