diff --git a/src/Avalonia.Base/Utilities/IWeakEventSubscriber.cs b/src/Avalonia.Base/Utilities/IWeakEventSubscriber.cs index 57060853c8..6cf8c605a7 100644 --- a/src/Avalonia.Base/Utilities/IWeakEventSubscriber.cs +++ b/src/Avalonia.Base/Utilities/IWeakEventSubscriber.cs @@ -11,7 +11,7 @@ public interface IWeakEventSubscriber where TEventArgs : EventArg void OnEvent(object? sender, WeakEvent ev, TEventArgs e); } -public class WeakEventSubscriber : IWeakEventSubscriber where TEventArgs : EventArgs +public sealed class WeakEventSubscriber : IWeakEventSubscriber where TEventArgs : EventArgs { public event Action? Event; @@ -19,4 +19,21 @@ public class WeakEventSubscriber : IWeakEventSubscriber { Event?.Invoke(sender, ev, e); } -} \ No newline at end of file +} + +public sealed class TargetWeakEventSubscriber : IWeakEventSubscriber where TEventArgs : EventArgs +{ + private readonly TTarget _target; + private readonly Action _dispatchFunc; + + public TargetWeakEventSubscriber(TTarget target, Action dispatchFunc) + { + _target = target; + _dispatchFunc = dispatchFunc; + } + + void IWeakEventSubscriber.OnEvent(object? sender, WeakEvent ev, TEventArgs e) + { + _dispatchFunc(_target, sender, ev, e); + } +} diff --git a/src/Avalonia.Base/Visual.cs b/src/Avalonia.Base/Visual.cs index e25cb854cf..4fd21f02f9 100644 --- a/src/Avalonia.Base/Visual.cs +++ b/src/Avalonia.Base/Visual.cs @@ -108,7 +108,7 @@ namespace Avalonia private IRenderRoot? _visualRoot; private IVisual? _visualParent; private bool _hasMirrorTransform; - private WeakEventSubscriber? _affectsRenderWeakSubscriber; + private TargetWeakEventSubscriber? _affectsRenderWeakSubscriber; /// /// Initializes static members of the class. @@ -383,11 +383,11 @@ namespace Avalonia { if (sender._affectsRenderWeakSubscriber == null) { - sender._affectsRenderWeakSubscriber = new WeakEventSubscriber(); - sender._affectsRenderWeakSubscriber.Event += delegate - { - sender.InvalidateVisual(); - }; + sender._affectsRenderWeakSubscriber = new TargetWeakEventSubscriber( + sender, static (target, _, _, _) => + { + target.InvalidateVisual(); + }); } InvalidatedWeakEvent.Subscribe(newValue, sender._affectsRenderWeakSubscriber); }