Во время перемещения части операции перетаскивания никакие события не генерируются.
Для создания обратной связи вы можете использовать Timer
; запустите его в событии ItemDrag
и остановитесь в DragDrop
.
В Tick
вы можете предоставить визуальную обратную связь, возможно, выбрав узел, находящийся в данный момент под курсором мыши, или нарисовав линию.
Вот как вы получаете узел под курсором и рисуете линию:
private void timer1_Tick(object sender, EventArgs e)
{
if (Control.MouseButtons.HasFlag(MouseButtons.Left))
{
using (Graphics g = treeView1.CreateGraphics())
{
treeView1.Refresh();
var hitt = treeView1.HitTest(treeView1.PointToClient(Control.MousePosition));
var n = hitt.Node;
if (n != null)
{
int y = n.Bounds.Y; // draw above the node; maybe change to n.Bound.Bottom ?
Size sz = treeView1.ClientSize;
g.DrawLine(Pens.Orange, 0, y, sz.Width, y);
}
}
}
}
Обратите внимание, что это один из редких случаев, когда вы используете control.CreateGraphics()
для фактического рисования на элемент управления.
Также обратите внимание, что часто сложная часть действительно должна решить, куда должна идти капля: на тот же уровень, что и узел (таким образом, переупорядочивая элементы на том же уровне) или на один уровень ближе к корню, чем последний узел перед ..? - Пример. Проводник Windows не позволяет изменять порядок элементов.