Browse Source

Improve SharpTreeView keyboard navigation.

pull/1/head
Daniel Grunwald 14 years ago
parent
commit
cb2deee9d3
  1. 35
      SharpTreeView/SharpTreeView.cs
  2. 1
      SharpTreeView/SharpTreeViewItem.cs

35
SharpTreeView/SharpTreeView.cs

@ -162,29 +162,38 @@ namespace ICSharpCode.TreeView @@ -162,29 +162,38 @@ namespace ICSharpCode.TreeView
protected override void OnKeyDown(KeyEventArgs e)
{
SharpTreeViewItem container = e.OriginalSource as SharpTreeViewItem;
switch (e.Key) {
case Key.Left:
if (container != null && ItemsControl.ItemsControlFromItemContainer(container) == this) {
if (container.Node.IsExpanded) {
container.Node.IsExpanded = false;
} else if (container.Node.Parent != null) {
this.FocusNode(container.Node.Parent);
}
e.Handled = true;
}
break;
case Key.Right:
SharpTreeViewItem container = e.OriginalSource as SharpTreeViewItem;
if (container != null && ItemsControl.ItemsControlFromItemContainer(container) == this) {
bool newExpanded = (e.Key == Key.Right);
if (container.Node.IsExpanded != newExpanded) {
container.Node.IsExpanded = newExpanded;
} else {
// already in collapsed/expanded - jump to parent/first child:
if (e.Key == Key.Right) {
container.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
} else if (container.Node.Parent != null) {
this.FocusNode(container.Node.Parent);
}
if (!container.Node.IsExpanded && container.Node.ShowExpander) {
container.Node.IsExpanded = true;
} else if (container.Node.Children.Count > 0) {
// jump to first child:
container.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
}
e.Handled = true;
}
break;
default:
base.OnKeyDown(e);
case Key.Return:
case Key.Space:
if (container != null && Keyboard.Modifiers == ModifierKeys.None && this.SelectedItems.Count == 1 && this.SelectedItem == container.Node) {
container.Node.ActivateItem(e);
}
break;
}
if (!e.Handled)
base.OnKeyDown(e);
}
public void FocusNode(SharpTreeNode node)

1
SharpTreeView/SharpTreeViewItem.cs

@ -37,6 +37,7 @@ namespace ICSharpCode.TreeView @@ -37,6 +37,7 @@ namespace ICSharpCode.TreeView
case Key.F2:
if (SharpTreeNode.ActiveNodes.Count == 1 && Node.IsEditable) {
Node.IsEditing = true;
e.Handled = true;
}
break;
case Key.Escape:

Loading…
Cancel
Save