From 6d5b3e02c4458ae75df2bf04fb2df9146aa90102 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 10 Jun 2016 20:57:30 +0200 Subject: [PATCH] Added page up/down support to virt lists. --- .../Presenters/ItemVirtualizerSimple.cs | 27 ++++++++++++++++++- .../KeyboardNavigationHandler.cs | 6 +++++ .../Navigation/DirectionalNavigation.cs | 1 - 3 files changed, 32 insertions(+), 2 deletions(-) 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)