Browse Source

Merge pull request #6656 from AvaloniaUI/fixes/3429-scroll-gesture-virtualization

Improve scroll gesture with virtualization.
release/0.10.8
Dan Walmsley 5 years ago
parent
commit
8c6da75b17
  1. 19
      src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs

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

@ -60,9 +60,6 @@ namespace Avalonia.Controls.Presenters
o => o.Viewport, o => o.Viewport,
(o, v) => o.Viewport = v); (o, v) => o.Viewport = v);
// Arbitrary chosen value, probably need to ask ILogicalScrollable
private const int LogicalScrollItemSize = 50;
private bool _canHorizontallyScroll; private bool _canHorizontallyScroll;
private bool _canVerticallyScroll; private bool _canVerticallyScroll;
private bool _arranging; private bool _arranging;
@ -351,7 +348,8 @@ namespace Avalonia.Controls.Presenters
if (Extent.Height > Viewport.Height || Extent.Width > Viewport.Width) if (Extent.Height > Viewport.Height || Extent.Width > Viewport.Width)
{ {
var scrollable = Child as ILogicalScrollable; var scrollable = Child as ILogicalScrollable;
bool isLogical = scrollable?.IsLogicalScrollEnabled == true; var isLogical = scrollable?.IsLogicalScrollEnabled == true;
var logicalScrollItemSize = new Vector(1, 1);
double x = Offset.X; double x = Offset.X;
double y = Offset.Y; double y = Offset.Y;
@ -361,13 +359,18 @@ namespace Avalonia.Controls.Presenters
_activeLogicalGestureScrolls?.TryGetValue(e.Id, out delta); _activeLogicalGestureScrolls?.TryGetValue(e.Id, out delta);
delta += e.Delta; delta += e.Delta;
if (isLogical && scrollable is object)
{
logicalScrollItemSize = Bounds.Size / scrollable.Viewport;
}
if (Extent.Height > Viewport.Height) if (Extent.Height > Viewport.Height)
{ {
double dy; double dy;
if (isLogical) if (isLogical)
{ {
var logicalUnits = delta.Y / LogicalScrollItemSize; var logicalUnits = delta.Y / logicalScrollItemSize.Y;
delta = delta.WithY(delta.Y - logicalUnits * LogicalScrollItemSize); delta = delta.WithY(delta.Y - logicalUnits * logicalScrollItemSize.Y);
dy = logicalUnits * scrollable!.ScrollSize.Height; dy = logicalUnits * scrollable!.ScrollSize.Height;
} }
else else
@ -384,8 +387,8 @@ namespace Avalonia.Controls.Presenters
double dx; double dx;
if (isLogical) if (isLogical)
{ {
var logicalUnits = delta.X / LogicalScrollItemSize; var logicalUnits = delta.X / logicalScrollItemSize.X;
delta = delta.WithX(delta.X - logicalUnits * LogicalScrollItemSize); delta = delta.WithX(delta.X - logicalUnits * logicalScrollItemSize.X);
dx = logicalUnits * scrollable!.ScrollSize.Width; dx = logicalUnits * scrollable!.ScrollSize.Width;
} }
else else

Loading…
Cancel
Save