Browse Source

Added page up/down support to virt lists.

pull/545/head
Steven Kirk 10 years ago
parent
commit
6d5b3e02c4
  1. 27
      src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs
  2. 6
      src/Avalonia.Input/KeyboardNavigationHandler.cs
  3. 1
      src/Avalonia.Input/Navigation/DirectionalNavigation.cs

27
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;
}
/// <summary>
/// Ensures an offset value is within the value range.
/// </summary>
/// <param name="value">The value.</param>
/// <returns>The coerced value.</returns>
private double CoerceOffset(double value)
{
var max = Math.Max(ExtentValue - ViewportValue, 0);
return MathUtilities.Clamp(value, 0, max);
}
}
}

6
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)

1
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)

Loading…
Cancel
Save