Как реализовать автоматическую прокрутку (например, ListView прокручивает, когда вы приближаетесь к вершине или внизу) в ListView ListView? Я охотился на Google с небольшой удачей. Я не могу поверить, что это не работает из коробки! Заранее спасибо DaveC# Внедрение автоматического прокрутки в ListView при перетаскивании и удалении
ответ
Прокрутка может быть выполнена с помощью метода ListViewItem.EnsureVisible. Вам нужно определить, находится ли элемент, который вы сейчас перетаскиваете, на видимой границе списка и не является первым/последним.
private static void RevealMoreItems(object sender, DragEventArgs e)
{
var listView = (ListView)sender;
var point = listView.PointToClient(new Point(e.X, e.Y));
var item = listView.GetItemAt(point.X, point.Y);
if (item == null)
return;
var index = item.Index;
var maxIndex = listView.Items.Count;
var scrollZoneHeight = listView.Font.Height;
if (index > 0 && point.Y < scrollZoneHeight)
{
listView.Items[index - 1].EnsureVisible();
}
else if (index < maxIndex && point.Y > listView.Height - scrollZoneHeight)
{
listView.Items[index + 1].EnsureVisible();
}
}
Затем подключите этот метод к событию DragOver.
targetListView.DragOver += RevealMoreItems;
targetListView.DragOver += (sender, e) =>
{
e.Effect = DragDropEffects.Move;
};
Спасибо за ссылку (http://www.knowdotnet.com/articles/listviewdragdropscroll.html), I C# ПУРЭ это
class ListViewBase:ListView
{
private Timer tmrLVScroll;
private System.ComponentModel.IContainer components;
private int mintScrollDirection;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
const int WM_VSCROLL = 277; // Vertical scroll
const int SB_LINEUP = 0; // Scrolls one line up
const int SB_LINEDOWN = 1; // Scrolls one line down
public ListViewBase()
{
InitializeComponent();
}
protected void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.tmrLVScroll = new System.Windows.Forms.Timer(this.components);
this.SuspendLayout();
//
// tmrLVScroll
//
this.tmrLVScroll.Tick += new System.EventHandler(this.tmrLVScroll_Tick);
//
// ListViewBase
//
this.DragOver += new System.Windows.Forms.DragEventHandler(this.ListViewBase_DragOver);
this.ResumeLayout(false);
}
protected void ListViewBase_DragOver(object sender, DragEventArgs e)
{
Point position = PointToClient(new Point(e.X, e.Y));
if (position.Y <= (Font.Height/2))
{
// getting close to top, ensure previous item is visible
mintScrollDirection = SB_LINEUP;
tmrLVScroll.Enabled = true;
}else if (position.Y >= ClientSize.Height - Font.Height/2)
{
// getting close to bottom, ensure next item is visible
mintScrollDirection = SB_LINEDOWN;
tmrLVScroll.Enabled = true;
}else{
tmrLVScroll.Enabled = false;
}
}
private void tmrLVScroll_Tick(object sender, EventArgs e)
{
SendMessage(Handle, WM_VSCROLL, (IntPtr)mintScrollDirection, IntPtr.Zero);
}
}
Я использовал тот же код, но его не работает для меня, почему? – Ram
Ответ Джорджа Полевого намного проще, чем этот –
Посмотрите ObjectListView. Он делает это. Вы можете прочитать код и использовать его, если вы не хотите использовать ObjectListView.
Только примечание для будущих гуглеров: чтобы эта работа работала над более сложными элементами управления (такими как DataGridView), см. this thread.
- 1. Страница прокрутки при перетаскивании изображения
- 2. ListView не обновляется при перетаскивании
- 3. Внедрение автоматического класса C++ в редакторе
- 4. Получить идентификатор верхнего DIV при перетаскивании и удалении
- 5. Предотвращение прокрутки UITableView при перетаскивании заголовка раздела
- 6. Остановка прокрутки при перетаскивании на сенсорные устройства
- 7. Установить непрозрачность полосы прокрутки при перетаскивании?
- 8. JQuery слайдер прокрутки div при перетаскивании?
- 9. Внедрение механизма автоматического обновления
- 10. Предотвращение прокрутки при перетаскивании мышью к краю экрана
- 11. ListView прокрутки последний пункт WPF C#
- 12. Внедрение системы поиска для ListView в C#
- 13. Ошибка при удалении элемента в ListView
- 14. Предотвращение автоматического прокрутки contenteditable
- 15. Автоматическая прокрутка при перетаскивании
- 16. Внедрение JFXPanel в приложении Swing не выполняется при добавлении/удалении
- 17. Предотвращение автоматического прокрутки при добавлении чего-то
- 18. Странное поведение при удалении изображения из ListView
- 19. Приложение. Сбой при удалении элемента из ListView
- 20. Кнопка автоматического прокрутки CSS
- 21. Обновить фрагмент при удалении элементов ListView
- 22. Внедрение диагонального прокрутки libgdx
- 23. Обработка прокрутки события в listview в C#
- 24. С помощью прокрутки колеса мыши при перетаскивании в реакцию dnd
- 25. андроид ListView автоматического скрытие пользовательского быстрой прокрутки палец
- 26. Как реализовать мгновенный поиск при перетаскивании прокрутки в vitamio
- 27. переполнение скрытого автоматического прокрутки
- 28. В столбце автоматического позиционирования прокрутки
- 29. При удалении, верхний и нижний колонтитулы прокрутки TableView тоже
- 30. Как убрать перекрытие двух изображений при перетаскивании в C#?
Как только вы получите ненулевой элемент, вы всегда можете вызвать item.EnsureVisible(). Если требуется прокрутка, он сделает это, и в противном случае он ничего не сделает. –
Я не понимаю. Идея здесь - вызов InsureVisible для элемента рядом с тем, который вы перетаскиваете. –
Вы можете использовать item.EnsureVisible() после проверки того, что элемент не является нулевым и избегать получения индекса, maxIndex, scrollZoneHeight и т. Д. Пользователь должен перетащить немного больше по верхнему или нижнему краю, но он работает. Если вы хотите, чтобы пользователь получал прокрутку, только зависающую над первым или последним элементом, то да, ваш код идеально подходит. –