WinForms Перетаскивание не прокручивает список [дубликат]

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

  element.onmousemove = function (e) {// Некоторое здесь код ... alert  («Мышь перемещена!»);  };   

Теперь, когда вы хотите удалить событие, просто выполните это:

  element.onmousemove = null;   

Done!

Надеюсь, это поможет вам, ребята!

8
задан Pacman 17 May 2011 в 18:49
поделиться

2 ответа

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

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

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

Убедитесь, что ваш код перетаскивания древовидной структуры работает правильно без автопрокрутки. См. Разделы в этой папке для получения дополнительной информации о том, как реализовать перетаскивание в древовидной структуре.

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

Чтобы рассказать о древовидной структуре для прокрутки вверх или вниз вам нужно вызвать функцию 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 определите, где находится курсор мыши по отношению к верхней и нижней части управления древовидной структурой. Затем вызовите SendMessage для прокрутки как подходящего.

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

Взято из здесь .

10
ответ дан Deanna 17 August 2018 в 10:07
поделиться
  • 1
    Отличная почта !!! – Pacman 17 May 2011 в 19:11
  • 2
    Возможно, измените (TreeView1.Top + scrollRegion) на (scrollRegion). По-моему, вам не нужна максимальная ценность. Сначала я попытался добавить TreeView1.Top (древовидная структура находится в нижней части моей формы) и startet процесса прокрутки в середине дерева. Поэтому я удалил TreeView1.Top и прокрутку startet в верхней части моего дерева. – daniel 15 February 2012 в 11:58
  • 3
    @shaahin, не могли бы вы разместить фактические определения макроса winapi? Я знаю, что 277 - WM_VSCROLL, но я не могу понять 1 и 0 из файлов заголовков. – Jonathan Henson 6 March 2012 в 19:45
  • 4
    Благодаря! Я подключил его к событию DragOver, потому что нет такого события, как DragScroll – Couitchy 10 June 2014 в 16:00

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

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

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 вашего древовидного изображения (или любой другой элемент управления / пользовательский элемент управления, который вы хотите включить прокрутку во время перетаскивания) и вызовите метод Scroll ().

    private void treeView_DragOver(object sender, DragEventArgs e)
    {
        treeView.Scroll();
    }
21
ответ дан Vedran 17 August 2018 в 10:07
поделиться
  • 1
    @Vedran это здорово! но есть ли способ сделать прокрутку телевизора немного медленнее? Кажется, что у меня немного быстро ...? – MaxOvrdrv 18 December 2015 в 19:35
Другие вопросы по тегам:

Похожие вопросы: