我想从默认(蓝色)更改ListView中的选择颜色。我无法根据自己的需要调整任何代码。
这是最接近的代码。
If e.Item.Selected = True Then
e.Graphics.FillRectangle(New SolidBrush(Color.Gray), e.Bounds)
TextRenderer.DrawText(e.Graphics, e.Item.Text, New Font(ListView2.Font, Nothing), New Point(e.Bounds.Left + 3, e.Bounds.Top + 2), Color.White)
Else
e.DrawDefault = True
End If
主要问题是e.Item.Text
部分。它不适用于多列列表视图。结果如下。
选择前:
......之后:
是否可以保留其他列的值并仍然具有完整的行选择?
感谢。
答案 0 :(得分:2)
使用OwnerDraw Listview
时要记住的是,如果控件是详细信息{{1},则有 2个事件响应(或覆盖,如果您是子类) }:View
和DrawColumnHeader
。
DrawSubItem
并且没有要绘制的子项时,将使用 DrawItem
。
由于View
与SubItems(0)
相同,您可以使用Item.Text
绘制项目和子项目文本。我无法分辨该片段的位置,但这可行:
DrawSubItem
您可能正在使用正确的事件,但是使用Private Sub lv1_DrawSubItem(sender As Object,
e As DrawListViewSubItemEventArgs) Handles lv1.DrawSubItem
' use sender instead of a hardcodes control ref so
' you can paste this to another LV
Dim myLV As ListView = CType(sender, ListView)
If e.ItemIndex > 0 AndAlso e.Item.Selected Then
Using br As New SolidBrush(Color.Gray)
e.Graphics.FillRectangle(br, e.Bounds)
End Using
Using fnt As New Font(myLV .Font, Nothing)
' use e.SubItem.Text
TextRenderer.DrawText(e.Graphics, e.SubItem.Text,
fnt,
New Point(e.Bounds.Left + 3, e.Bounds.Top + 2),
Color.White)
End Using ' dispose!
Else
e.DrawDefault = True
End If
End Sub
而不是Item.Text
,也会为所有子项目绘制项目文本(e.SubItem.Text
将被调用和子项目一样多次。
请注意,我还将DrawSubItem
包裹在Font
块中以处理它。使用LimeGreen,结果: