在ListView中更改列标题的字体样式和颜色

3

我了解到,要改变ListView的标题颜色,我们需要使用以下代码:

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

我们使用同样的事件来改变ListView的标题样式:

private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
    using (StringFormat sf = new StringFormat())
    {
        sf.Alignment = StringAlignment.Center;
        e.DrawBackground();

        using (Font headerFont =
            new Font("Microsoft Sans Serif", 9, FontStyle.Bold)) //Font size!!!!
        {
            e.Graphics.DrawString(e.Header.Text, headerFont, 
                Brushes.Black, e.Bounds, sf);
        }
    }
}

现在我的问题是我想要同时改变标题的颜色和样式。所以我这样写:

现在我的问题是我想要同时改变标题的颜色和样式。所以我这样写:

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

    using (StringFormat sf = new StringFormat())
    {
        sf.Alignment = StringAlignment.Center;
        e.DrawBackground();

        using (Font headerFont =
            new Font("Microsoft Sans Serif", 9, FontStyle.Bold)) //Font size!!!!
        {
            e.Graphics.DrawString(e.Header.Text, headerFont,
                Brushes.Black, e.Bounds, sf);
        }
    }
}

但是,如果我执行这段代码,标题会变成粗体,但标题颜色不会改变。要同时更改它们(即标题颜色和标题样式),我缺少什么?我不明白。


e.DrawBackground(); 看起来不对 - 如果你正在使用自己的颜色填充矩形,为什么还要让 LV 去做呢? - Ňɏssa Pøngjǣrdenlarp
@Plutonix,是的,但是当我将它移除后,标题会显示两次。现在我该怎么办? - Gopi
除去 e.DrawText()。对于渲染控件文本,TextRenderer.DrawText 更为合适(而非 DrawString)。 - Ňɏssa Pøngjǣrdenlarp
@Gopi:请看下面的答案。当您将其删除时,您会看到重复的绘图,因为您通过ListView和自己绘制文本。 - Jakob Möllås
1个回答

6
尝试一下,即跳过对e.DrawText()e.DrawBackground()的调用:
private void list_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
    using (var sf = new StringFormat())
    {
        sf.Alignment = StringAlignment.Center;

        using (var headerFont = new Font("Microsoft Sans Serif", 9, FontStyle.Bold))
        {
            e.Graphics.FillRectangle(Brushes.Pink, e.Bounds);
            e.Graphics.DrawString(e.Header.Text, headerFont, 
                Brushes.Black, e.Bounds, sf);
        }
    }
}

1
谢谢,它有效了。当我移除 e.DrawText() 后,它显示出我想要的效果。 - Gopi
请注意在 DrawString() 之前仅使用 FillRectangle() - Alexandre Daubricourt
如果我将属性“owner draw”设置为true,则此代码可以正常工作。但现在我的数据/行不再显示,有什么想法吗? - prototype0815

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接