Если установить значение свойства DrawMode списка равным
DrawMode.OwnerDrawVariable, обрабатывая события MeasureItem и DrawItem,
генерируемые при задании размеров и прорисовки элементов списка, можно
перерисовать все изображение списка. В следующем примере создаётся список, у
которого текст каждого элемента имеет свой цвет, фон элементов имеет цвет
AliceBlue, а выбранный элемент выделяется контуром.
Public Class MyList
Inherits System.Windows.Forms.ListBox
Public Sub New()
MyBase.New()
MyBase.DrawMode = DrawMode.OwnerDrawVariable
End SubProtected Overrides Sub OnDrawItem(
ByVal e As System.Windows.Forms.DrawItemEventArgs)
MyBase.OnDrawItem(e)
e.DrawBackground()
e.DrawFocusRectangle()
Dim item As ListBoxItem
Dim b As Rectangle = e.Bounds
Dim rc As RectangleF = New RectangleF(b.X + 2, b.Y + 1, b.Width - 4, b.Height - 4)
Dim sf As StringFormat = New StringFormat()
sf.Alignment = StringAlignment.Near
Dim fnt As Font = New Font("Verdana", 10, FontStyle.Bold, GraphicsUnit.Point)
item = CType(MyClass.Items(e.Index), ListBoxItem)
e.Graphics.FillRectangle(New SolidBrush(Color.AliceBlue), rc)
e.Graphics.DrawString(item.text, fnt, New SolidBrush(item.ItemColor), rc, sf)
End SubProtected Overrides Sub OnMeasureItem(
ByVal e As System.Windows.Forms.MeasureItemEventArgs)
e.ItemHeight = 20
End Sub
End ClassPublic Class ListBoxItem
Private mText As String
Private mColor As Color
Public Sub New(ByVal text As String,
ByVal theColor As Color)
mText = text
mColor = theColor
End SubPublic Property text() As String
Get
Return mText
End Get
Set(ByVal Value As String)
mText = Value
End Set
End PropertyPublic Property ItemColor() As Color
Get
Return mColor
End Get
Set(ByVal Value As Color)
mColor = Value
End Set
End Property
End Class
Для тестирования списка в код сгенерированный мастером проекта, добавьте
следующий код:
Dim ml As MyList = New MyList()
Private Sub Form1_Load(ByVal sender As Object,
ByVal e As System.EventArgs) Handles MyBase.Load
ml.SetBounds(20, 20, 100, 60)
ml.Items.Add(New ListBoxItem("red", Color.Red))
ml.Items.Add(New ListBoxItem("blue", Color.Blue))
ml.Items.Add(New ListBoxItem("green", Color.Green))
Me.Controls.Add(ml)
AddHandler ml.SelectedIndexChanged, AddressOf ml_SelectedIndexChanged
End SubPrivate Sub ml_SelectedIndexChanged(ByVal s As Object,
ByVal e As EventArgs)
Dim itm As ListBoxItem = CType(ml.SelectedItem, ListBoxItem)
Me.BackColor = itm.ItemColor
End Sub