2010-02-15 130 views
7
  1. 有沒有辦法給列表框項目的部分上色(不僅是整行)? 例如列表框項目由5個字組成,只有一個是有色的或3個5.
  2. 有沒有一種方法可以對ListView執行相同操作? (我知道ListView可以爲每列着色,但我想在一列中有多種顏色)。

我只對免費解決方案感興趣,並且首選他們並不沉重地實施或更改當前使用情況(儘量不引入彩色ListBox代替普通的ListBox)。在C#WinForms中爲Listbox/ListView行的部分着色的方法?

與問候,

MadBoy

回答

14

This article告訴我們如何使用帶有DrawMode的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單獨調用。您必須用每個單詞的x,y位置或邊界矩形替換e.bounds。

同樣的方法應該適用於ListView

+0

只是一個觀察:據我所知,這可以防止當Control的內容太大時出現自動水平滾動條('Horizo​​ntalScrollbar = true;')。 – Pooven

1

沒有內置的支持這種類型的修改到一個WinForms ListBoxListView API。這當然是可能的,但解決方案將涉及大量的自定義繪畫,並可能覆蓋WndProc。這將是一個非常複雜且沉重的解決方案。

如果這種類型的經驗對您的應用程序很重要,我認爲您應該非常認真地考慮WPF作爲解決方案。 WPF旨在提供這種類型的眼睛糖果,並有可能在網絡上的許多樣本讓你啓動和運行。

+0

是的,我非常熱衷於使用WPF,但是我應該在1年前選擇WPF,而不是現在當它是90k行代碼(其中GUI是30k行)。移植到WPF將是一個真正的時間殺手。 – MadBoy