如何在C#WinForms中对Listbox / ListView行的部分进行着色?

  1. 有没有办法为ListBox项目的部分(不仅是整行)着色? 例如,列表框项由5个单词组成,只有一个是彩色的,或者是5个中的3个。
  2. 有没有办法对ListView做同样的事情? (我知道ListView可以按列着色,但我希望在一列中有多种颜色)。

我只对免费解决方案感兴趣,并且希望它们不会很难实现或改变当前的使用情况(引入彩色ListBox代替正常情况的努力最少)。

带着敬意,

疯狂的男孩

本文介绍如何使用ListBox的DrawItem ,并将DrawMode设置为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。 你必须用每个单词的x,y位置或边界矩形替换e.bounds。

相同的方法应该适用于ListView 。

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

如果这种类型的经验对您的应用程序很重要,我认为您应该认真考虑WPF作为解决方案。 WPF旨在提供这种类型的视觉效果,网上可能有很多样本可以帮助您启动和运行。