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)