protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); if (e.Handled) { return; } switch (e.Key) { case Key.Add: if (CanExpandOnInput && !IsExpanded) { SetCurrentValue(IsExpandedProperty, true); e.Handled = true; } break; case Key.Subtract: if (CanExpandOnInput && IsExpanded) { SetCurrentValue(IsExpandedProperty, false); e.Handled = true; } break; case Key.Left: case Key.Right: if (LogicalLeft(e.Key)) { if (CanExpandOnInput && IsExpanded) { if (IsFocused) { SetCurrentValue(IsExpandedProperty, false); } else { Focus(); } } else { ParentTreeView.SelectParentFromKey(); } } else { if (CanExpandOnInput) { if (!IsExpanded) { SetCurrentValue(IsExpandedProperty, true); } else { ParentTreeView.SelectNextFromKey(); } } } e.Handled = true; break; case Key.Down: ParentTreeView.SelectNextFromKey(); e.Handled = true; break; case Key.Up: ParentTreeView.SelectPreviousFromKey(); e.Handled = true; break; case Key.F2: e.Handled = StartEditing(); break; case Key.Escape: case Key.Return: StopEditing(); e.Handled = true; break; case Key.Space: ParentTreeView.SelectCurrentBySpace(); e.Handled = true; break; case Key.Home: ParentTreeView.SelectFirst(); e.Handled = true; break; case Key.End: ParentTreeView.SelectLast(); e.Handled = true; break; } }