WinForms:动态更改列表框文本颜色的最简单方法?

时间:2015-03-20 18:32:59

标签: c# winforms text colors listbox

寻找一种简单的方法将颜色文本(或粗体文本)添加到列表框项目(我在Stackoverflow中看到的解决方案对我的需求来说似乎过于复杂)。

我一直在通过以下代码向我的列表框添加评论:

listBox1.Items.Add("Test complete!");

这条线在我的代码中遍布。我希望能够用颜色修改偶尔的文本,以便像“测试完成!”这样的行。显示为绿色。

是否有一个简单的,即时的解决方案?

2 个答案:

答案 0 :(得分:3)

你可以稍微设置work进行设置,如果你只想设置字体颜色或字体,那就不那么复杂了。

您必须为DrawItem事件添加处理程序。

this.listBox1.DrawItem += new DrawItemEventHandler(listBox1_DrawItem);

这是一个非常简单的处理程序,它可以满足您的需求。

void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    Graphics g = e.Graphics;
    Dictionary<string, object> props = (this.listBox1.Items[e.Index] as Dictionary<string, object>);
    SolidBrush backgroundBrush = new SolidBrush(props.ContainsKey("BackColor") ? (Color)props["BackColor"] : e.BackColor);
    SolidBrush foregroundBrush = new SolidBrush(props.ContainsKey("ForeColor") ? (Color)props["ForeColor"] : e.ForeColor);
    Font textFont = props.ContainsKey("Font") ? (Font)props["Font"] : e.Font;
    string text = props.ContainsKey("Text") ? (string)props["Text"] : string.Empty;
    RectangleF rectangle = new RectangleF(new PointF(e.Bounds.X, e.Bounds.Y), new SizeF(e.Bounds.Width, g.MeasureString(text, textFont).Height));

    g.FillRectangle(backgroundBrush, rectangle);
    g.DrawString(text, textFont, foregroundBrush, rectangle);

    backgroundBrush.Dispose();
    foregroundBrush.Dispose();
    g.Dispose();
}

然后将项目添加到ListBox,您可以执行此操作。

this.listBox1.Items.Add(new Dictionary<string, object> { { "Text", "Something, something"},
                                                         { "BackColor", Color.Red },
                                                         { "ForeColor", Color.Green}});
this.listBox1.Items.Add(new Dictionary<string, object> { { "Text", "darkside!!" },
                                                         { "BackColor", Color.Blue },
                                                         { "ForeColor", Color.Green },
                                                         { "Font", new Font(new Font("Arial", 9), FontStyle.Bold) } });

我认为相当简单。

Tada

答案 1 :(得分:0)

如果没有自己在ListBox中绘制项目,则无法做到。但是,使用代码并不难实现。假设项目未在列表框中删除/重新排序的简单实现仅涉及保持字典将索引映射到颜色,然后使用以下内容绘制它:

private void ListBox_DrawItem(object sender, DrawItemEventArgs e)
{
    var isItemSelected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);

    Color foreColor;
    if (!this.mColorsByIndex.TryGetValue(e.Index, out foreColor))
    {
        foreColor = isItemSelected ? SystemColors.HighlightText : this.mListBox.ForeColor;
    }

    var backColor = isItemSelected ? SystemColors.Highlight : this.mListBox.BackColor;
    using (var backBrush = new SolidBrush(backColor))
    {
        e.Graphics.FillRectangle(backBrush, e.Bounds);
    }

    var item = this.mListBox.Items[e.Index];
    var itemText = this.mListBox.GetItemText(item);
    const TextFormatFlags formatFlags = TextFormatFlags.Left | TextFormatFlags.VerticalCenter;
    TextRenderer.DrawText(e.Graphics, itemText, e.Font, e.Bounds, foreColor, formatFlags);
}

WinForms中的自定义绘图而言,这几乎就像它一样简单。

请注意ListBox.Items.Add会返回您添加的项目的索引。

如果你移除/更改/重新排序ListBox中的项目,那么跟上颜色关联会变得有点困难,但这会使跟踪颜色关联变得复杂,而不是跟踪图形本身。