protected override void OnKeyUp(KeyEventArgs e) { base.OnKeyUp(e); if (!e.Handled) { Key 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: IEnumerable <TreeViewExItem> items = TreeViewElementFinder.FindAll(ParentTreeView, false); TreeViewExItem focusedItem = items.FirstOrDefault(x => x.IsFocused); if (focusedItem != null) { focusedItem.BringIntoView(new Rect(1, 1, 1, 1)); } break; } } }
internal TreeViewExItem GetTreeViewItemFor(object item) { foreach (var treeViewExItem in TreeViewElementFinder.FindAll(this, false)) { if (item == treeViewExItem.DataContext) { return(treeViewExItem); } } return(null); }
private TreeViewExItem GetFocusedItem() { foreach (var item in TreeViewElementFinder.FindAll(treeViewEx, false)) { if (item.IsFocused) { return(item); } } return(null); }
private void OnSelectedItemsChanged(object sender, NotifyCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: object last = null; foreach (var item in GetTreeViewItemsFor(e.NewItems)) { item.IsSelected = true; item.BringIntoView(); last = item.DataContext; } LastSelectedItem = last; break; case NotifyCollectionChangedAction.Remove: foreach (var item in GetTreeViewItemsFor(e.OldItems)) { item.IsSelected = false; if (item.DataContext == LastSelectedItem) { if (SelectedItems.Count > 0) { LastSelectedItem = SelectedItems[SelectedItems.Count - 1]; } else { LastSelectedItem = null; } } } break; case NotifyCollectionChangedAction.Reset: foreach (var item in TreeViewElementFinder.FindAll(this, false)) { if (item.IsSelected) { item.IsSelected = false; } } LastSelectedItem = null; break; default: throw new InvalidOperationException(); } }
internal IEnumerable <TreeViewExItem> GetNodesToSelectBetween(TreeViewExItem firstNode, TreeViewExItem 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 <TreeViewExItem>(); if (lastIndex == firstIndex) { return(new List <TreeViewExItem> { firstNode }); } if (lastIndex > firstIndex) { for (int i = firstIndex; i <= lastIndex; i++) { if (allNodes[i].IsVisible) { nodesToSelect.Add(allNodes[i]); } } } else { for (int i = firstIndex; i >= lastIndex; i--) { if (allNodes[i].IsVisible) { nodesToSelect.Add(allNodes[i]); } } } return(nodesToSelect); }
internal IEnumerable <TreeViewExItem> GetTreeViewItemsFor(IEnumerable objects) { if (objects == null) { yield break; } var items = objects.Cast <object>().ToList(); foreach (var treeViewExItem in TreeViewElementFinder.FindAll(this, false)) { if (items.Contains(treeViewExItem.DataContext)) { yield return(treeViewExItem); } } }
public void SelectPreviousFromKey() { List <TreeViewExItem> items = TreeViewElementFinder.FindAll(treeViewEx, true).ToList(); TreeViewExItem item = GetFocusedItem(); item = treeViewEx.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); } FocusHelper.Focus(item); }
public SelectionMultiple(TreeViewEx treeViewEx) { this.treeViewEx = treeViewEx; BorderSelectionLogic = new BorderSelectionLogic(treeViewEx, TreeViewElementFinder.FindAll(treeViewEx, false)); }