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