在C# WinForms中,如何给Listbox/ListView的行的部分区域上色?

8
  1. 有没有办法对ListBox项目的部分内容进行着色(不仅限于整行)?例如,列表框项目由5个单词组成,只有一个单词被着色或者5个单词中有3个被着色。
  2. 是否有办法在ListView中实现相同的效果?(我知道可以按列对ListView进行着色,但我希望在一列中有多种颜色)。

我只对免费解决方案感兴趣,并且希望它们不需要太大的实现或更改当前使用方式(最好只需少量努力即可将着色的ListBox引入替换普通的ListBox)。

祝好,

MadBoy

2个回答

18

本文章讲述了如何使用ListBox的DrawItem,并将其设置为OwnerDraw值之一。基本上,你需要像这样做:

listBox1.DrawMode = OwnerDrawFixed;
listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem);

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();
// TODO: Split listBox1.Items[e.Index].ToString() and then draw each separately in a different color
e.Graphics.DrawString(listBox1.Items[e.Index].ToString(),new Font(FontFamily.GenericSansSerif, 14, FontStyle.Bold),new SolidBrush(color[e.Index]),e.Bounds);
}

将单个DrawString调用替换为拆分listBox1.Items[e.Index].ToString()成单词,并为每个单词进行单独的DrawString调用。您需要为每个单词替换e.bounds为x、y位置或边界矩形。

对于ListView,同样的方法也适用。


仅作一点观察:据我所知,这会防止当Control内容过大时自动出现水平滚动条(HorizontalScrollbar = true;)。 - Pooven

1

没有内置的API支持对WinForms ListBoxListView进行此类型的修改。虽然可以实现这一点,但解决方案将涉及大量自定义绘制和可能覆盖WndProc。这将是一个非常复杂和繁重的解决方案。

如果这种体验对您的应用程序很重要,我认为您应该非常认真地考虑WPF作为解决方案。 WPF旨在提供这种类型的视觉效果,并且可能有许多网络示例可帮助您快速上手。


是的,我非常热衷于使用WPF进行工作,但我应该在一年前选择WPF,而不是现在,因为它已经有90,000行代码(其中GUI大约有30,000行)。将其移植到WPF将会非常耗费时间。 - MadBoy

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