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) { item = parent; parent = parent.Parent as TreeViewItem; } else { // We are not at the last item return; } } e.Handled = true; interactiveWindowContent.TraverseNext(tree); } else if (e.Key == Key.Up && e.KeyboardDevice.Modifiers == ModifierKeys.None) { TreeListView tree = (TreeListView)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; interactiveWindowContent.TraversePrevious(tree); } }