Изменить цвет фона заголовков Winform ListView

Как вы можете изменить цвет фона заголовков ListView?


person Alex    schedule 29.11.2009    source источник
comment
вам нужно будет реализовать пользовательский рисунок, переопределив событие Paint.   -  person Mitch Wheat    schedule 29.11.2009
comment
переопределение метода Paint ничего не делает в ListView. Вам нужно использовать механизм OwnerDraw, который предложил @David. Просто помните, что при этом удаляются все стили из вашего элемента управления заголовком — ни горячих элементов, ни индикаторов сортировки, ни градиентного фона.   -  person Grammarian    schedule 30.11.2009


Ответы (2)


Это можно сделать, задав для свойства OwnerDraw представления списка значение true.

Затем это позволяет вам предоставлять обработчики событий для событий рисования списка.

Подробный пример есть в MSDN.

Ниже приведен пример кода для установки красного цвета заголовка:

    private void listView1_DrawColumnHeader(object sender,
                                            DrawListViewColumnHeaderEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.Red, e.Bounds);
        e.DrawText();
    }

Я думаю (но рад, что оказался неправ), что с OwnerDraw, установленным в true, вам также нужно будет предоставить обработчики для других событий рисования, которые имеют реализации по умолчанию, как показано ниже:

    private void listView1_DrawItem(object sender,
                                    DrawListViewItemEventArgs e)
    {
        e.DrawDefault = true;
    }

Мне, конечно, не удалось заставить список рисовать элементы без этого.

person David Hall    schedule 29.11.2009
comment
В качестве предупреждения, потому что мне потребовалось больше часа, чтобы понять это, не помещайте команду MSGBOX в заголовок drawcolumn! Он зависает vb.net - в противном случае это работало нормально - person cardmagik; 22.02.2016

Я знаю, что это немного поздно для вечеринки, но я все еще видел этот пост, и это помогло бы мне. Вот небольшое абстрактное приложение кода, предоставленного Дэвидом

using System.Windows.Forms;
using System.Drawing;

//List view header formatters
public static void colorListViewHeader(ref ListView list, Color backColor, Color foreColor)
{
    list.OwnerDraw = true;
    list.DrawColumnHeader += 
        new DrawListViewColumnHeaderEventHandler
        (
            (sender, e) => headerDraw(sender, e, backColor, foreColor)
        );
    list.DrawItem += new DrawListViewItemEventHandler(bodyDraw);
}

private static void headerDraw(object sender, DrawListViewColumnHeaderEventArgs e, Color backColor, Color foreColor)
{
    using (SolidBrush backBrush = new SolidBrush(backColor))
    {
        e.Graphics.FillRectangle(backBrush, e.Bounds);
    }

    using (SolidBrush foreBrush = new SolidBrush(foreColor))
    {
        e.Graphics.DrawString(e.Header.Text, e.Font, foreBrush, e.Bounds);
    }
}

private static void bodyDraw(object sender, DrawListViewItemEventArgs e)
{
    e.DrawDefault = true;
}

Затем вызовите это в конструкторе формы

public Form()
{
    InitializeComponent();
    *CLASS NAME*.colorListViewHeader(ref myListView, *SOME COLOR*, *SOME COLOR*);
}

Просто замените *ИМЯ КЛАССА* на любой класс, в который вы поместили первый бит кода, а *НЕКОТОРЫЕ ЦВЕТА* на какой-то цвет.

//Some examples:
Color.white
SystemColors.ActiveCaption
Color.FromArgb(0, 102, 255, 102);
person Nick Pray    schedule 23.08.2015