【问题标题】:Way to color parts of the Listbox/ListView line in C# WinForms?在 C# WinForms 中为 Listbox/ListView 行的部分着色的方法?
【发布时间】:2011-01-17 02:36:24
【问题描述】:
  1. 有没有办法为 ListBox 项的部分着色(不仅是整行)? 例如列表框项目由 5 个单词组成,只有一个是彩色的或 5 个中的 3 个。
  2. 有没有办法对 ListView 做同样的事情? (我知道 ListView 可以按列着色,但我想在一列中有多种颜色)。

我只对免费的解决方案感兴趣,并且更喜欢它们不难实现或改变当前的使用(引入彩色 ListBox 代替普通的最好的努力最少)。

关于,

疯子

【问题讨论】:

    标签: c# winforms listview listbox colors


    【解决方案1】:

    This article 告诉如何使用 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。您必须将 e.bounds 替换为 x,y 位置或每个单词的边界矩形。

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

    【讨论】:

    • 只是一个观察:据我所知,当Control 的内容太大时,这会阻止自动水平滚动条(HorizontalScrollbar = true;)出现。
    【解决方案2】:

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

    如果这种体验对您的应用程序很重要,我认为您应该非常认真地考虑将 WPF 作为一种解决方案。 WPF 旨在提供这种类型的眼睛糖果,并且网络上可能有许多示例可以让您启动和运行。

    【讨论】:

    • 是的,我非常热衷于使用 WPF,但我应该在一年前就选择 WPF,而不是现在它有 90k 行代码(其中 GUI 就像 30k 行)。将它移植到 WPF 真的会浪费时间。
    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2011-06-07
    相关资源
    最近更新 更多