public TreeItem FindStrategyNearItem(TreeItem treeItem)
        {
            if (treeItem == null)
            {
                return(null);
            }

            if (treeItem is LogicalTreeItem && SearchStrategy == SearchStrategy.VisualTree)
            {
                return(VisualTreeItem.FindVisualTreeItem(treeItem.Instance));
            }

            if (treeItem is VisualTreeItem && SearchStrategy == SearchStrategy.LogicalTree)
            {
                var logicalItem = LogicalTreeItem.FindLogicalTreeItem(treeItem.Instance);
                while (logicalItem == null)
                {
                    treeItem    = treeItem.Parent;
                    logicalItem = LogicalTreeItem.FindLogicalTreeItem(treeItem.Instance);
                }
                treeItem = logicalItem;
            }

            return(treeItem);
        }
Exemplo n.º 2
0
        private void OnAdornerTimerTick(object sender, EventArgs e)
        {
            bool modifierPressed = Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl);

            // Start hovering
            if (modifierPressed && !_lastPressed)
            {
                _refreshTimer.Start();
            }

            // Stop hovering
            if (_lastPressed && !modifierPressed)
            {
                ApplySelectedTreeItem();
                _refreshTimer.Stop();
            }

            _lastPressed = modifierPressed;

            if (!modifierPressed)
            {
                return;
            }

            ActivateWindowAtMousePosition();

            var directlyOverElement = GetElementAtMousePos();

            if (DireclyOverElement != directlyOverElement)
            {
                FrameworkElement element = directlyOverElement;

                if (_selectedTreeItemService.SearchStrategy == SearchStrategy.LogicalTree)
                {
                    element = FindLogicalElement(element);
                }
                else
                {
                    // If SHIFT is pressed, automatically skip template parts and move up to the control itself
                    if (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift))
                    {
                        while (element != null && element.TemplatedParent != null)
                        {
                            element = VisualTreeHelper.GetParent(element) as FrameworkElement;
                        }
                    }
                    _selectedTreeItem = VisualTreeItem.FindVisualTreeItem(element);
                }

                UpdateAdorner(element);
                DireclyOverElement = element;
                NotifyMouseElementChanged();
            }
        }