diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs b/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs index ad8de04192..dce76e4875 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs @@ -52,10 +52,13 @@ namespace Avalonia.Rendering.Composition return res; } - private static void ProcessHitTestReadbackUpdates(IReadOnlyList readbackUpdates) + private static void ProcessHitTestReadbackUpdates(IReadOnlyList> readbackUpdates) { - foreach (var visual in readbackUpdates) + foreach (var weakVisual in readbackUpdates) { + if (!weakVisual.TryGetTarget(out var visual)) + continue; + if (visual.Parent is CompositionContainerVisual parent) parent.UpdateHitTestChildBounds(visual); } diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ReadbackIndices.cs b/src/Avalonia.Base/Rendering/Composition/Server/ReadbackIndices.cs index c06506c530..094c72b585 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/ReadbackIndices.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/ReadbackIndices.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Threading; @@ -16,11 +17,11 @@ namespace Avalonia.Rendering.Composition.Server private ulong _nextWriteRevision = 1; public ulong WriteRevision { get; private set; } public ulong LastCompletedWrite { get; private set; } - private readonly HashSet _pendingHitTestUpdateSet = new(); - private List _pendingHitTestUpdates = new(); - private List _readHitTestUpdates = new(); + private readonly HashSet> _pendingHitTestUpdateSet = new(); + private List> _pendingHitTestUpdates = new(); + private List> _readHitTestUpdates = new(); - public IReadOnlyList NextRead() + public IReadOnlyList> NextRead() { lock (_lock) { @@ -49,7 +50,7 @@ namespace Avalonia.Rendering.Composition.Server Monitor.Exit(_lock); } - internal void AddHitTestUpdate(CompositionVisual? visual) + internal void AddHitTestUpdate(WeakReference? visual) { if (visual != null && _pendingHitTestUpdateSet.Add(visual)) _pendingHitTestUpdates.Add(visual); diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual/ServerCompositionVisual.cs b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual/ServerCompositionVisual.cs index 5182006a74..51f12fb227 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual/ServerCompositionVisual.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual/ServerCompositionVisual.cs @@ -20,7 +20,7 @@ namespace Avalonia.Rendering.Composition.Server { public ServerCompositionVisualCollection? Children { get; private set; } = null!; public ServerCompositionVisualCache? Cache { get; private set; } - internal CompositionVisual? Client { get; set; } + internal WeakReference? Client { get; set; } partial void OnRootChanging() { diff --git a/src/Avalonia.Base/Rendering/Composition/Visual.cs b/src/Avalonia.Base/Rendering/Composition/Visual.cs index 552548d158..096d588ed7 100644 --- a/src/Avalonia.Base/Rendering/Composition/Visual.cs +++ b/src/Avalonia.Base/Rendering/Composition/Visual.cs @@ -22,7 +22,7 @@ namespace Avalonia.Rendering.Composition partial void InitializeDefaultsExtra() { - Server.Client = this; + Server.Client = new WeakReference(this); } partial void OnRootChanged() => OnRootChangedCore();