Browse Source

Get effective viewport size from forthcoming arrange.

Instead of using `ScrollContentPresenter.Viewport` which hasn't been updated yet.
pull/4091/head
Steven Kirk 6 years ago
parent
commit
516bc8b4e1
  1. 7
      src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs
  2. 5
      src/Avalonia.Controls/Repeater/ViewportManager.cs

7
src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs

@ -90,7 +90,7 @@ namespace Avalonia.Controls.Presenters
this.GetObservable(ChildProperty).Subscribe(UpdateScrollableSubscription);
}
internal event EventHandler<EventArgs> PreArrange;
internal event EventHandler<VectorEventArgs> PreArrange;
/// <summary>
/// Gets or sets a value indicating whether the content can be scrolled horizontally.
@ -241,7 +241,10 @@ namespace Avalonia.Controls.Presenters
/// <inheritdoc/>
protected override Size ArrangeOverride(Size finalSize)
{
PreArrange?.Invoke(this, EventArgs.Empty);
PreArrange?.Invoke(this, new VectorEventArgs
{
Vector = new Vector(finalSize.Width, finalSize.Height),
});
if (_logicalScrollSubscription != null || Child == null)
{

5
src/Avalonia.Controls/Repeater/ViewportManager.cs

@ -9,6 +9,7 @@ using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Threading.Tasks;
using Avalonia.Controls.Presenters;
using Avalonia.Input;
using Avalonia.Layout;
using Avalonia.Logging;
using Avalonia.Media;
@ -537,10 +538,10 @@ namespace Avalonia.Controls
return Disposable.Empty;
}
private void ScrollContentPresenterPreArrange(object sender, EventArgs e)
private void ScrollContentPresenterPreArrange(object sender, VectorEventArgs e)
{
var scp = (ScrollContentPresenter)sender;
var effectiveViewport = new Rect((Point)scp.Offset, scp.Viewport);
var effectiveViewport = new Rect((Point)scp.Offset, new Size(e.Vector.X, e.Vector.Y));
if (effectiveViewport != _visibleWindow)
{

Loading…
Cancel
Save