Нарисуйте линию на дереве, перетаскивая в него узел - PullRequest
1 голос
/ 21 марта 2019

я хочу нарисовать линию относится к узлу в древовидной структуре, который мышь перетаскивает при перетаскивании, чтобы дать пользователю возможность увидеть местоположение, в котором он будет перетаскивать узел в нечто вроде перетаскивания в окнах , как этоизображение

1 Ответ

0 голосов
/ 21 марта 2019

Во время перемещения части операции перетаскивания никакие события не генерируются.

Для создания обратной связи вы можете использовать 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 не позволяет изменять порядок элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...