Browse Source

Duplicate listeners before raising EffectiveViewportChanged.

pull/4173/head
Steven Kirk 6 years ago
parent
commit
13d828cdcc
  1. 35
      src/Avalonia.Layout/LayoutManager.cs

35
src/Avalonia.Layout/LayoutManager.cs

@ -1,4 +1,5 @@
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Diagnostics;
using Avalonia.Logging;
@ -329,18 +330,36 @@ namespace Avalonia.Layout
if (_effectiveViewportChangedListeners is object)
{
// TODO: This may not work correctly if listener is removed in event handler.
for (var i = 0; i < _effectiveViewportChangedListeners.Count; ++i)
{
var l = _effectiveViewportChangedListeners[i];
var viewport = CalculateEffectiveViewport(l.Listener);
var count = _effectiveViewportChangedListeners.Count;
var pool = ArrayPool<EffectiveViewportChangedListener>.Shared;
var listeners = pool.Rent(count);
_effectiveViewportChangedListeners.CopyTo(listeners);
if (viewport != l.Viewport)
try
{
for (var i = 0; i < count; ++i)
{
l.Listener.EffectiveViewportChanged(new EffectiveViewportChangedEventArgs(viewport));
_effectiveViewportChangedListeners[i] = new EffectiveViewportChangedListener(l.Listener, viewport);
var l = _effectiveViewportChangedListeners[i];
if (!l.Listener.IsAttachedToVisualTree)
{
continue;
}
var viewport = CalculateEffectiveViewport(l.Listener);
if (viewport != l.Viewport)
{
l.Listener.EffectiveViewportChanged(new EffectiveViewportChangedEventArgs(viewport));
_effectiveViewportChangedListeners[i] = new EffectiveViewportChangedListener(l.Listener, viewport);
}
}
}
finally
{
pool.Return(listeners, clearArray: true);
}
}
return startCount != _toMeasure.Count + _toMeasure.Count;

Loading…
Cancel
Save