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))); } })); } }