Winforms TreeView, я хочу прокручивать вверх / вниз, когда пользователь перетаскивает элемент.
Автопрокрутка TreeView при перетаскивании
Ответы (2)
Когда вы реализуете перетаскивание в элементе управления в виде дерева, вам необходимо поддерживать некоторые функции автоматической прокрутки. Например, когда вы перетаскиваете элемент из видимого узла дерева, а целевой узел дерева находится за пределами текущего представления древовидного представления, элемент управления должен автоматически прокручиваться вверх или вниз в зависимости от направления мыши.
Элемент управления 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);
}
Взято с здесь.
(TreeView1.Top + scrollRegion)
на (scrollRegion)
. На мой взгляд, вам не нужна высшая ценность. Сначала я попытался добавить TreeView1.Top (древовидное представление находится внизу моей формы), а процесс прокрутки начался в середине древовидного представления. Поэтому я удалил TreeView1.Top и начало прокрутки в верхней части древовидной структуры.
- person daniel; 15.02.2012
Практически то же самое, что и выше, но без этой «главной» ошибки и немного проще для использования в более крупных проектах.
Добавьте этот класс в свой проект:
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();
}