protected override void OnKeyUp(KeyEventArgs e) { base.OnKeyUp(e); if (e.Handled) { return; } var key = e.Key; switch (key) { case Key.Left: case Key.Right: case Key.Up: case Key.Down: case Key.Add: case Key.Subtract: case Key.Space: var items = TreeViewElementFinder.FindAll(ParentTreeView, false); var focusedItem = items.FirstOrDefault(x => x.IsFocused); focusedItem?.BringIntoView(new Rect(1, 1, 1, 1)); break; } }
private void OnSelectedItemsChanged(object sender, NotifyCollectionChangedEventArgs e) { if (updatingSelection) { return; } if (SelectionMode == SelectionMode.Single && !allowedSelectionChanges) { throw new InvalidOperationException("Can only change SelectedItems collection in multiple selection modes. Use SelectedItem in single select modes."); } updatingSelection = true; switch (e.Action) { case NotifyCollectionChangedAction.Add: object last = null; foreach (var item in GetTreeViewItemsFor(e.NewItems)) { item.IsSelected = true; last = item.DataContext; } SelectedItem = last; break; case NotifyCollectionChangedAction.Remove: foreach (var item in GetTreeViewItemsFor(e.OldItems)) { item.IsSelected = false; if (item.DataContext == SelectedItem) { SelectedItem = SelectedItems.Count > 0 ? SelectedItems[SelectedItems.Count - 1] : null; } } break; case NotifyCollectionChangedAction.Reset: foreach (var item in TreeViewElementFinder.FindAll(this, false)) { if (item.IsSelected) { item.IsSelected = false; } } SelectedItem = null; break; default: throw new InvalidOperationException(); } updatingSelection = false; }
internal IEnumerable <TreeViewItem> GetNodesToSelectBetween([NotNull] TreeViewItem firstNode, [NotNull] TreeViewItem lastNode) { var allNodes = TreeViewElementFinder.FindAll(this, false).ToList(); var firstIndex = allNodes.IndexOf(firstNode); var lastIndex = allNodes.IndexOf(lastNode); if (firstIndex >= allNodes.Count) { throw new InvalidOperationException( "First node index " + firstIndex + "greater or equal than count " + allNodes.Count + "."); } if (lastIndex >= allNodes.Count) { throw new InvalidOperationException( "Last node index " + lastIndex + " greater or equal than count " + allNodes.Count + "."); } var nodesToSelect = new List <TreeViewItem>(); if (lastIndex == firstIndex) { return(new List <TreeViewItem> { firstNode }); } if (lastIndex > firstIndex) { for (var i = firstIndex; i <= lastIndex; i++) { if (allNodes[i].IsVisible) { nodesToSelect.Add(allNodes[i]); } } } else { for (var i = firstIndex; i >= lastIndex; i--) { if (allNodes[i].IsVisible) { nodesToSelect.Add(allNodes[i]); } } } return(nodesToSelect); }
internal IEnumerable <TreeViewItem> GetTreeViewItemsFor(IEnumerable objects) { if (objects == null) { yield break; } var items = objects.Cast <object>().ToList(); foreach (var treeViewItem in TreeViewElementFinder.FindAll(this, false)) { if (items.Contains(treeViewItem.DataContext)) { yield return(treeViewItem); } } }
internal virtual void SelectPreviousFromKey() { var items = TreeViewElementFinder.FindAll(this, true).ToList(); var item = GetFocusedItem(); if (item == null) { return; } item = GetPreviousItem(item, items); if (item == null) { return; } // if ctrl is pressed just focus it, so it can be selected by space. Otherwise select it. if (!IsControlKeyDown) { SelectSingleItem(item); } item.ForceFocus(); }
protected TreeViewItem GetFocusedItem() { return(TreeViewElementFinder.FindAll(this, false).FirstOrDefault(x => x.IsFocused)); }
public TreeViewItem GetTreeViewItemFor(object item) { return(TreeViewElementFinder.FindAll(this, false).FirstOrDefault(treeViewItem => item == treeViewItem.DataContext)); }