Вот решение, которое учитывает каждый из режимов отображения ListView
:
Мы полагаемся на то, что при прокрутке ListView
положение элементов меняется. Если мы проверим изменение первого свойства ListViewItem
Bounds
, мы сможем отследить, произошло ли движение.
Вам нужно будет добавить элемент управления Timer
в ту же форму, в которой включен ListView
, и установить для его свойства Enabled
значение True
(это означает, что он будет срабатывать регулярно, не будучи Start
ред). Также добавьте приватную переменную в свой класс формы, чтобы записать первый элемент Bounds
.
private Rectangle _firstItemBounds = null;
Когда вы заполняете ListView
, установите для этой переменной значение Bounds
первого элемента. Например:
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 1000; i++)
{
listView1.Items.Add(new ListViewItem("Item " + i));
}
_firstItemBounds = listView1.Items[0].Bounds;
}
Затем добавьте обработчик для события Timer
Tick
:
private void timer1_Tick(object sender, EventArgs e)
{
if (listView1.Items[0] == null)
{
return;
}
Rectangle bounds = listView1.Items[0].Bounds;
if (bounds != _firstItemBounds)
{
_firstItemBounds = bounds;
// Any scroll logic here
// ...
}
}
Кажется, что по умолчанию Timer Interval
100 мс работает нормально, но вам, возможно, потребуется настроить его в соответствии с вашим приложением.
Надеюсь, это поможет.