Пример #1
0
        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;
            }
        }
Пример #2
0
        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;
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
                }
            }
        }
Пример #5
0
        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();
        }
Пример #6
0
 protected TreeViewItem GetFocusedItem()
 {
     return(TreeViewElementFinder.FindAll(this, false).FirstOrDefault(x => x.IsFocused));
 }
Пример #7
0
 public TreeViewItem GetTreeViewItemFor(object item)
 {
     return(TreeViewElementFinder.FindAll(this, false).FirstOrDefault(treeViewItem => item == treeViewItem.DataContext));
 }