Автопрокрутка TreeView при перетаскивании

Winforms TreeView, я хочу прокручивать вверх/вниз, когда пользователь перетаскивает и элемент.

2 ответов


при реализации перетаскивания в элементе управления treeview необходимо поддерживать некоторые функции автоматической прокрутки. Например, когда вы перетаскиваете элемент из видимого узла дерева, а узел дерева назначения находится вне текущего представления treeview, элемент управления должен автоматически прокручиваться вверх или вниз в зависимости от направления мыши.

элемент управления Windows Forms Treeview не включает встроенные функции для выполнения этого. Тем не менее, это довольно легко реализовать это самостоятельно.

Шаг 1: получите ваш код перетаскивания treeview

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

Шаг 2: Добавьте определение для функции SendMessage

чтобы сообщить treeview прокручивать вверх или вниз, вам нужно вызвать функцию Windows API SendMessage (). Делать это, добавьте следующий код в верхней части вашего класса:

// Make sure you have the correct using clause to see DllImport:
// using System.Runtime.InteropServices;
 [DllImport("user32.dll")]
    private static extern int SendMessage (IntPtr hWnd, int wMsg, int wParam, 
        int lParam);

Шаг 3: подключитесь к событию DragScroll

в событии DragScroll определите, где находится курсор мыши по отношению к верхней и нижней части элемента управления treeview. Затем вызовите SendMessage для прокрутки как apporpriate.

// Implement an "autoscroll" routine for drag
//  and drop. If the drag cursor moves to the bottom
//  or top of the treeview, call the Windows API
//  SendMessage function to scroll up or down automatically.
private void DragScroll (
    object sender,
    DragEventArgs e)
{
    // Set a constant to define the autoscroll region
    const Single scrollRegion = 20;

    // See where the cursor is
    Point pt =  TreeView1.PointToClient(Cursor.Position);

    // See if we need to scroll up or down
    if ((pt.Y + scrollRegion) > TreeView1.Height)
    {
        // Call the API to scroll down
        SendMessage(TreeView1.Handle, (int)277, (int)1, 0);
    }
    else if (pt.Y < (TreeView1.Top + scrollRegion))
    {
        // Call thje API to scroll up
        SendMessage(TreeView1.Handle, (int)277, (int)0, 0);
}

принято от здесь.


почти то же самое, что и выше, но без этой "верхней" ошибки и немного проще использовать в больших проектах.

добавьте этот класс в свой проект:

public static class NativeMethods
{
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

    public static void Scroll(this Control control)
    {
        var pt = control.PointToClient(Cursor.Position);

        if ((pt.Y + 20) > control.Height)
        {
            // scroll down
            SendMessage(control.Handle, 277, (IntPtr) 1, (IntPtr) 0);
        }
        else if (pt.Y < 20)
        {
            // scroll up
            SendMessage(control.Handle, 277, (IntPtr) 0, (IntPtr) 0);
        }
    }
}

затем просто подпишитесь на событие DragOver вашего treeview (или любой другой элемент управления/пользовательский элемент управления, который вы хотите включить прокрутку при перетаскивании) и вызовите метод Scroll ().

    private void treeView_DragOver(object sender, DragEventArgs e)
    {
        treeView.Scroll();
    }