如何实现ListView点击行(Item)时同步高亮对应图片?
实现ListView行点击时对应图片高亮的方案
前提准备
首先需要确保ListView的每个条目(Item)和对应的图片建立关联,关联方式可以根据你的图片存储方式选择:
方式一:用ImageList管理图片(Tile视图自带图片)
如果你的图片是放在ListView的Tile中显示,推荐用ImageList来管理正常和高亮两种状态的图片:
- 添加ImageList控件:在窗体上添加
ImageList控件(命名为ImageList1),将正常状态的图片和高亮状态的图片依次添加进去(比如索引0是正常图,索引1是高亮图)。 - 绑定ImageList到ListView:在代码里设置:
ListView2.LargeImageList = ImageList1 - 修改条目添加代码:给每个Item设置初始的图片索引:
Dim people = { New With { Key .FirstName = "FirstName", Key .Email = "firstname@emal.com", Key .Country = "USA" }, New With { Key .FirstName = "FirstName1", Key .Email = "firstname1@emal.com", Key .Country = "USA" } } For Each person In people Dim item As New ListViewItem(person.FirstName) item.SubItems.Add(person.Email) item.SubItems.Add(person.Country) item.ImageIndex = 0 ' 默认显示正常状态图片 ListView2.Items.Add(item) Next person - 处理选中事件:添加
SelectedIndexChanged事件,切换选中条目的图片索引实现高亮:Private Sub ListView2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView2.SelectedIndexChanged ' 恢复所有条目的正常图片 For Each item As ListViewItem In ListView2.Items item.ImageIndex = 0 Next ' 给选中条目设置高亮图片 If ListView2.SelectedItems.Count > 0 Then ListView2.SelectedItems(0).ImageIndex = 1 End If End Sub
方式二:关联独立的PictureBox控件
如果图片是放在单独的PictureBox中(比如ListView侧边的头像),可以通过Tag属性关联条目和PictureBox:
- 关联条目与PictureBox:在添加条目时,把对应的PictureBox引用存在Item的Tag里:
' 假设窗体上有PictureBox1、PictureBox2对应两个条目 For i = 0 To people.Length - 1 Dim person = people(i) Dim item As New ListViewItem(person.FirstName) item.SubItems.Add(person.Email) item.SubItems.Add(person.Country) ' 将对应的PictureBox存入Tag item.Tag = If(i = 0, PictureBox1, PictureBox2) ListView2.Items.Add(item) ' 初始设置正常样式(比如无边框) DirectCast(item.Tag, PictureBox).BorderStyle = BorderStyle.None Next - 处理选中事件:在事件中切换PictureBox的样式实现高亮:
Private Sub ListView2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView2.SelectedIndexChanged ' 恢复所有PictureBox的正常样式 For Each item As ListViewItem In ListView2.Items Dim pb As PictureBox = DirectCast(item.Tag, PictureBox) pb.BorderStyle = BorderStyle.None ' 若用图片切换则替换为正常图:pb.Image = My.Resources.NormalAvatar Next ' 给选中条目对应的PictureBox设置高亮样式 If ListView2.SelectedItems.Count > 0 Then Dim selectedPb As PictureBox = DirectCast(ListView2.SelectedItems(0).Tag, PictureBox) selectedPb.BorderStyle = BorderStyle.FixedSingle ' 用边框表示高亮 ' 若用图片切换则替换为高亮图:selectedPb.Image = My.Resources.HighlightedAvatar End If End Sub
高亮效果自定义
你可以根据需求调整高亮方式:
- 给图片添加带颜色的边框
- 替换为预先制作的高亮版本图片
- 调整图片的透明度或背景色
- 给图片添加阴影效果
内容的提问来源于stack exchange,提问作者Archi
相关产品推荐
相关产品推荐

