private void Tree_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Down && e.KeyboardDevice.Modifiers == ModifierKeys.None)
{
TreeView tree = (TreeView)sender;
TreeViewItem item = e.OriginalSource as TreeViewItem;
// if item is expanded and has items, then this item is not the last one :)
if (item.HasItems && item.IsExpanded)
return;
// Check inside the parent
TreeViewItem parent = item.Parent as TreeViewItem;
while (parent != null)
{
if (parent.Items.IndexOf(item) == parent.Items.Count - 1)
{
parent = parent.Parent as TreeViewItem;
}
else
{
// We are not at the last item
return;
}
}
e.Handled = true;
tree.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
else if (e.Key == Key.Up && e.KeyboardDevice.Modifiers == ModifierKeys.None)
{
TreeView tree = (TreeView)sender;
TreeViewItem item = e.OriginalSource as TreeViewItem;
// Check inside the parent
TreeViewItem parent = item.Parent as TreeViewItem;
if (parent != null || tree.Items.IndexOf(item) > 1) // 1 is because of the header
{
// We are not at the first item
return;
}
e.Handled = true;
tree.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous));
}
}