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
Re: ListView (winform) - перерисовка в произвольное время
От: dalex_v Россия  
Дата: 09.01.14 13:14
Оценка:
Это ж надо же. Столько голову ломал, не мог понять в чем дело. Написал тут вопрос и через полчаса сам нашёл причину проблемы


P.S. Проблема была в том, что в форме, на котором лежал контрол, в событии Paint я присваивал бэкграунд к ListView (бэкграунд вырезался из формы по размерам ListView). И по каждому событию перерисовки формы ещё перерисовывался и сам ListView. Тупая моя ошибка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.