in HashCalculator/Controls/NavMenuListView.cs [111:187]
protected override void OnKeyDown(KeyRoutedEventArgs e)
{
var focusedItem = FocusManager.GetFocusedElement();
switch (e.Key)
{
case VirtualKey.Up:
this.TryMoveFocus(FocusNavigationDirection.Up);
e.Handled = true;
break;
case VirtualKey.Down:
this.TryMoveFocus(FocusNavigationDirection.Down);
e.Handled = true;
break;
case VirtualKey.Tab:
var shiftKeyState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
var shiftKeyDown = (shiftKeyState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
// If we're on the header item then this will be null and we'll still get the default behavior.
if (focusedItem is ListViewItem)
{
var currentItem = (ListViewItem)focusedItem;
bool onlastitem = currentItem != null && this.IndexFromContainer(currentItem) == this.Items.Count - 1;
bool onfirstitem = currentItem != null && this.IndexFromContainer(currentItem) == 0;
if (!shiftKeyDown)
{
if (onlastitem)
{
this.TryMoveFocus(FocusNavigationDirection.Next);
}
else
{
this.TryMoveFocus(FocusNavigationDirection.Down);
}
}
else // Shift + Tab
{
if (onfirstitem)
{
this.TryMoveFocus(FocusNavigationDirection.Previous);
}
else
{
this.TryMoveFocus(FocusNavigationDirection.Up);
}
}
}
else if (focusedItem is Control)
{
if (!shiftKeyDown)
{
this.TryMoveFocus(FocusNavigationDirection.Down);
}
else // Shift + Tab
{
this.TryMoveFocus(FocusNavigationDirection.Up);
}
}
e.Handled = true;
break;
case VirtualKey.Space:
case VirtualKey.Enter:
// Fire our event using the item with current keyboard focus
this.InvokeItem(focusedItem);
e.Handled = true;
break;
default:
base.OnKeyDown(e);
break;
}
}