Вам потребуется событие Scroll, чтобы обнаружить, что TopItem мог измениться.ListView не имеет его.Что, вероятно, является преднамеренным, класс содержит некоторые хаки, которые работают с ошибками в родном элементе управления Windows, хаки, использующие прокрутку.
Эти хаки, однако, не должны иметь большого значения в вашем случае, так как вы ищете только изменение вTopItem.Вы захотите переопределить метод WndProc (), чтобы получить сообщение LVN_ENDSCROLL.Это работало хорошо, хотя я не проверял это полностью.Добавьте новый класс в свой проект и вставьте код ниже.Компиляция.Перетащите новый элемент управления из верхней части панели инструментов на форму.Реализуйте событие TopItemChanged.
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class MyListView : ListView {
public event EventHandler TopItemChanged;
protected virtual void OnTopItemChanged(EventArgs e) {
var handler = TopItemChanged;
if (handler != null) handler(this, e);
}
protected override void WndProc(ref Message m) {
// Trap LVN_ENDSCROLL, delivered with a WM_REFLECT + WM_NOTIFY message
if (m.Msg == 0x204e) {
var notify = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR));
if (notify.code == -181 && !this.TopItem.Equals(lastTopItem)) {
OnTopItemChanged(EventArgs.Empty);
lastTopItem = this.TopItem;
}
}
base.WndProc(ref m);
}
private ListViewItem lastTopItem = null;
private struct NMHDR {
public IntPtr hwndFrom;
public IntPtr idFrom;
public int code;
}
}