Пример #1
0
        internal void HandleDragOver(SharpTreeViewItem item, DragEventArgs e)
        {
            HidePreview();

            var target = GetDropTarget(item, e);

            if (target != null)
            {
                e.Handled = true;
                ShowPreview(target.Item, target.Place);
            }

            var    sv          = STVUTILS.TryGetScrollViewer(this);
            double tolerance   = item.NodeView.ActualHeight / 2;
            double verticalPos = e.GetPosition(this).Y;

            // take the difference between tolerance and position to scroll more rapidly as tolerance gap closes
            if (verticalPos < tolerance)
            {
                sv.ScrollToVerticalOffset(sv.VerticalOffset - (tolerance - verticalPos));
            }
            else if (verticalPos > ActualHeight - tolerance)
            {
                sv.ScrollToVerticalOffset(sv.VerticalOffset + (verticalPos - ActualHeight + tolerance));
            }
        }
        /// <summary>
        /// Handles the node expanding event in the tree view.
        /// This method gets called only if the node is in the visible region (a SharpTreeNodeView exists).
        /// </summary>
        internal void HandleExpanding(SharpTreeNode node)
        {
            if (doNotScrollOnExpanding)
            {
                return;
            }
            SharpTreeNode lastVisibleChild = node;

            while (true)
            {
                SharpTreeNode tmp = lastVisibleChild.Children.LastOrDefault(c => c.IsVisible);
                if (tmp != null)
                {
                    lastVisibleChild = tmp;
                }
                else
                {
                    break;
                }
            }
            if (lastVisibleChild != node)
            {
                Debug.Assert(flattener != null);
                if (flattener == null)
                {
                    return;
                }
                // A new scrollViewer.ViewportHeight value is available at the earliest at Render prio.
                // If there are many empty lines, it will equal the number of visible items (eg. 5,
                // but viewport can show eg. 10).
                Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => {
                    var itemsPerPage          = STVUTILS.GetItemsPerPage(this, 0);
                    int nodeIndex             = flattener.IndexOf(node);
                    int lastVisibleChildIndex = flattener.IndexOf(lastVisibleChild);
                    Debug.Assert(nodeIndex >= 0 && lastVisibleChildIndex >= 0);
                    if (itemsPerPage > 0 && nodeIndex >= 0 && lastVisibleChildIndex >= 0)
                    {
                        int lastIndex = Math.Min(lastVisibleChildIndex, nodeIndex + itemsPerPage - 1);
                        ScrollIntoView(Items[lastIndex]);
                        Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => ScrollIntoView(node)));
                    }
                }));
            }
        }