Элемент управления ListView имеет проблему мерцания. Кажется, проблема в том, что перегрузка Update элемента управления неправильно реализована, поэтому она действует как Refresh. При обновлении элемент управления должен перерисовывать только свои недопустимые области, а элемент «Обновить» перерисовывает всю клиентскую область элемента управления. Таким образом, если вы хотите изменить, скажем, цвет фона одного элемента в списке, то нужно перекрасить только этот конкретный элемент. К сожалению, элемент управления ListView кажется другого мнения и хочет перекрасить всю свою поверхность всякий раз, когда вы связываетесь с одним элементом ... даже если элемент в данный момент не отображается. Таким образом, в любом случае, вы можете легко подавить мерцание, свернув свое собственное следующим образом:
class ListViewNF : System.Windows.Forms.ListView
{
public ListViewNF()
{
//Activate double buffering
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
//Enable the OnNotifyMessage event so we get a chance to filter out
// Windows messages before they get to the form's WndProc
this.SetStyle(ControlStyles.EnableNotifyMessage, true);
}
protected override void OnNotifyMessage(Message m)
{
//Filter out the WM_ERASEBKGND message
if(m.Msg != 0x14)
{
base.OnNotifyMessage(m);
}
}
}
От: Geekswithblogs.net