Way to color parts of the Listbox/ListView line in C# WinForms?

前端 未结 2 499
刺人心
刺人心 2020-12-18 00:45
  1. Is there a way to color parts of ListBox Items (not only whole line)? For example listbox item consists of 5 words and only one is colored or 3 of 5.
  2. Is the
相关标签:
2条回答
  • 2020-12-18 01:03

    There is no built-in API which supports this type of modification to a WinForms ListBox or ListView. It is certainly possible to achieve this but the solution will involve a lot of custom painting and likely overriding WndProc. This will be a very involved and heavy solution.

    If this type of experience is important to your application I think you should very seriously consider WPF as a solution. WPF is designed to provide this type of eye candy and there are likely many samples on the web to get you up and running.

    0 讨论(0)
  • 2020-12-18 01:13

    This article tells how to use DrawItem of a ListBox with DrawMode set to one of the OwnerDraw values. Basically, you do something like this:

    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);
    }
    

    Instead of the single DrawString call, Split listBox1.Items[e.Index].ToString() into words and make a separate call to DrawString for each word. You'll have to replace e.bounds with an x,y location or a bounding rectangle for each word.

    The same approach should work for ListView.

    0 讨论(0)
提交回复
热议问题