Browse Source

Fix directional nav for non-virtualized lists.

Except Page Up/Down - these will need some extra code.
pull/545/head
Steven Kirk 10 years ago
parent
commit
22b495b1ac
  1. 15
      src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs
  2. 16
      src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs
  3. 3
      src/Avalonia.Controls/StackPanel.cs
  4. 4
      src/Avalonia.Input/KeyboardNavigationHandler.cs
  5. 10
      src/Avalonia.Input/NavigationDirection.cs

15
src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs

@ -110,6 +110,21 @@ namespace Avalonia.Controls.Presenters
Owner.InvalidateMeasure();
}
/// <summary>
/// Scrolls the specified item into view.
/// </summary>
/// <param name="item">The item.</param>
public override void ScrollIntoView(object item)
{
var index = Items.IndexOf(item);
if (index != -1)
{
var container = Owner.ItemContainerGenerator.ContainerFromIndex(index);
container.BringIntoView();
}
}
private IList<ItemContainerInfo> AddContainers(int index, IEnumerable items)
{
var generator = Owner.ItemContainerGenerator;

16
src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs

@ -163,6 +163,14 @@ namespace Avalonia.Controls.Presenters
switch (direction)
{
case NavigationDirection.First:
newItemIndex = 0;
break;
case NavigationDirection.Last:
newItemIndex = ItemCount - 1;
break;
case NavigationDirection.Up:
if (vertical)
{
@ -199,14 +207,6 @@ namespace Avalonia.Controls.Presenters
case NavigationDirection.PageDown:
newItemIndex = Math.Min(ItemCount - 1, itemIndex + (int)ViewportValue);
break;
case NavigationDirection.Home:
newItemIndex = 0;
break;
case NavigationDirection.End:
newItemIndex = ItemCount - 1;
break;
}
return ScrollIntoView(newItemIndex);

3
src/Avalonia.Controls/StackPanel.cs

@ -115,6 +115,9 @@ namespace Avalonia.Controls
case NavigationDirection.Down:
index = horiz ? -1 : index + 1;
break;
default:
index = -1;
break;
}
if (index >= 0 && index < Children.Count)

4
src/Avalonia.Input/KeyboardNavigationHandler.cs

@ -124,10 +124,10 @@ namespace Avalonia.Input
direction = NavigationDirection.PageDown;
break;
case Key.Home:
direction = NavigationDirection.Home;
direction = NavigationDirection.First;
break;
case Key.End:
direction = NavigationDirection.End;
direction = NavigationDirection.Last;
break;
}

10
src/Avalonia.Input/NavigationDirection.cs

@ -57,15 +57,5 @@ namespace Avalonia.Input
/// Move the focus down a page.
/// </summary>
PageDown,
/// <summary>
/// Move the focus to the first item.
/// </summary>
Home,
/// <summary>
/// Move the focus to the last item.
/// </summary>
End,
}
}

Loading…
Cancel
Save