Это известная ошибка: ListView в виртуальном режиме неправильно прокручивается
Последний комментарий от Microsoft к этому отчету Connect:
Это проблема с базовым элементом управления Win32. Мы не сможем это исправить, команда ОС должна будет решить эту проблему.
Конечно, это было в 2005 году, так что, может быть, это исправлено в Win 8?
Тем временем, обходной путь выглядит так:
Создайте новый класс, который наследует ListView, и напишите следующий код:
private static FieldInfo _internalVirtualListSizeField;
static FlickerFreeListView()
{
_internalVirtualListSizeField = typeof(ListView).GetField("virtualListSize", System.Reflection.BindingFlags.NonPublic | BindingFlags.Instance);
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, int lParam);
private IntPtr SendMessage(int msg, int wparam, int lparam)
{
return SendMessage(new HandleRef(this, this.Handle), msg, wparam, lparam);
}
public void SetVirtualListSize(int size)
{
if (size < 0)
{
throw new ArgumentException("ListViewVirtualListSizeInvalidArgument");
}
_internalVirtualListSizeField.SetValue(this, size);
if ((base.IsHandleCreated && this.VirtualMode) && !base.DesignMode)
{
SendMessage(0x102f, size, 2);
}
}
Теперь обновите свой код, чтобы использовать метод SetVirtualListSize вместо исходного свойства VirtualListSize.
0x102f = LVM_SETITEMCOUNT
2 = LVSICF_NOSCROLL
ссылка:
http://msdn.microsoft.com/en-us/library/bb761188%28VS.85%29.aspx