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