Доброго дня!
Делаю тюнинг компоненты ListView под свои нужды. Суть — рисование нужным шрифтом, с нужными отступами, с нужными значками.
class ListViewDoubleBuffered : ListView
{
public ListViewDoubleBuffered():base()
{
SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer, true);
DrawItem += new DrawListViewItemEventHandler(ListViewDoubleBuffered_DrawItem);
OwnerDraw = true;
}
void ListViewDoubleBuffered_DrawItem(object sender, DrawListViewItemEventArgs e)
{
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
e.Graphics.ScaleTransform(0.97f, 1);
e.Graphics.DrawString(e.Item.Text, e.Item.Font, new SolidBrush(Color.White), e.Bounds.X+30, e.Bounds.Y+3);
if (e.Item.ImageList.Images.Count > 0)
{
var image = Resources.red_;
e.Graphics.DrawImage(image, new Rectangle(e.Bounds.X+11, e.Bounds.Y+2, image.Width, image.Height));
}
e.Graphics.ResetTransform();
}
}
Вроде бы список хорошо отрисовывается, быстро с двойной буферизацией, если менять что-то в коллекции итемов — перерисовывается очень быстро, но: раз в полминуты-минуту происходит перерисовка всего контрола, при этом сначала всё закрашивается цветом, который стоит бэкграундом, потом отрисовывается фон (картинка) и потом заполняются item'ы, и это всё происходит с такой скорость, что глаз вполне себе успевает заметить что что-то произошло, особенно если поставить цвет бэкграунда какой-нить контрастный. И ладно бы оно один раз при запуске контрола медленно отрисовывало, но это происходит регулярно, при том, что никаких изменений не делаю, даже мышкой не шевелю.
Контрол биндится к DataSet, который заполняю вручную один раз, добавляю 45 итемов. Режим представления контрола — List.
Как вылечить? Хотя бы одно из двух: либо заставить перерисовывать быстро, незаметно для глаза, либо что бы после первой отрисовки больше не перерисовывалось.
Это ж надо же. Столько голову ломал, не мог понять в чем дело. Написал тут вопрос и через полчаса сам нашёл причину проблемы
P.S. Проблема была в том, что в форме, на котором лежал контрол, в событии Paint я присваивал бэкграунд к ListView (бэкграунд вырезался из формы по размерам ListView). И по каждому событию перерисовки формы ещё перерисовывался и сам ListView. Тупая моя ошибка.