ListView (winform) - перерисовка в произвольное время
От: dalex_v Россия  
Дата: 09.01.14 12:20
Оценка:
Доброго дня!

Делаю тюнинг компоненты 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.

Как вылечить? Хотя бы одно из двух: либо заставить перерисовывать быстро, незаметно для глаза, либо что бы после первой отрисовки больше не перерисовывалось.
listview doublebuffer
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.