diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index e9fbd33c72..2b65add3f7 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -7,6 +7,7 @@ using System.Collections.Specialized; using System.Linq; using Avalonia.Controls.Utils; using Avalonia.Input; +using Avalonia.Utilities; namespace Avalonia.Controls.Presenters { @@ -165,6 +166,12 @@ namespace Avalonia.Controls.Presenters case NavigationDirection.Down: newItemIndex = itemIndex + 1; break; + case NavigationDirection.PageUp: + newItemIndex = Math.Max(0, itemIndex - (int)ViewportValue); + break; + case NavigationDirection.PageDown: + newItemIndex = Math.Min(ItemCount - 1, itemIndex + (int)ViewportValue); + break; } } else @@ -177,6 +184,12 @@ namespace Avalonia.Controls.Presenters case NavigationDirection.Right: newItemIndex = itemIndex + 1; break; + case NavigationDirection.PageUp: + newItemIndex = Math.Max(0, itemIndex - (int)ViewportValue); + break; + case NavigationDirection.PageDown: + newItemIndex = Math.Min(ItemCount - 1, itemIndex + (int)ViewportValue); + break; } } @@ -189,7 +202,8 @@ namespace Avalonia.Controls.Presenters if (newItemIndex < firstIndex || newItemIndex > lastIndex) { - OffsetValue += newItemIndex - itemIndex; + var newOffset = OffsetValue + (newItemIndex - itemIndex); + OffsetValue = CoerceOffset(newOffset); InvalidateScroll(); } @@ -398,5 +412,16 @@ namespace Avalonia.Controls.Presenters Owner.ItemContainerGenerator.Dematerialize(FirstIndex + index, count); NextIndex -= count; } + + /// + /// Ensures an offset value is within the value range. + /// + /// The value. + /// The coerced value. + private double CoerceOffset(double value) + { + var max = Math.Max(ExtentValue - ViewportValue, 0); + return MathUtilities.Clamp(value, 0, max); + } } } diff --git a/src/Avalonia.Input/KeyboardNavigationHandler.cs b/src/Avalonia.Input/KeyboardNavigationHandler.cs index 562f683079..959e478141 100644 --- a/src/Avalonia.Input/KeyboardNavigationHandler.cs +++ b/src/Avalonia.Input/KeyboardNavigationHandler.cs @@ -117,6 +117,12 @@ namespace Avalonia.Input case Key.Right: direction = NavigationDirection.Right; break; + case Key.PageUp: + direction = NavigationDirection.PageUp; + break; + case Key.PageDown: + direction = NavigationDirection.PageDown; + break; } if (direction.HasValue) diff --git a/src/Avalonia.Input/Navigation/DirectionalNavigation.cs b/src/Avalonia.Input/Navigation/DirectionalNavigation.cs index efd4539719..6d4da5d976 100644 --- a/src/Avalonia.Input/Navigation/DirectionalNavigation.cs +++ b/src/Avalonia.Input/Navigation/DirectionalNavigation.cs @@ -35,7 +35,6 @@ namespace Avalonia.Input.Navigation if (container != null) { - var isForward = IsForward(direction); var mode = KeyboardNavigation.GetDirectionalNavigation((InputElement)container); switch (mode)