private void DraggingMonitorLoop() { const int scrollMargin = 8; TreeNode lastOver = null; int overItemCount = 0; while (!abortThreads) { if (isDragging && dragginOverNode != null) { try { if (draggingLocation.Y <= scrollMargin) { TreeViewItems.ScrollUp(); } else if (draggingLocation.Y >= TreeViewItems.Height - scrollMargin) { TreeViewItems.ScrollDown(); } else if (lastOver != dragginOverNode) { this.Invoke((MethodInvoker) delegate { if (dragginOverNode.Nodes.Count > 0 && !dragginOverNode.IsExpanded) { lastOver = dragginOverNode; overItemCount = 0; } else { lastOver = null; } }); } else if (lastOver == dragginOverNode && lastOver != null && ++overItemCount >= 10) { this.Invoke((MethodInvoker) delegate { dragginOverNode.Expand(); lastOver = null; }); } } catch { } } Thread.Sleep(100); } }