我遇到了一些问题,我正在使用后台工作人员进行大量处理,并将项目添加到列表视图中:
AddListItem(ListView1, listItem)
以下是将命令发送到线程外的listview的委托代码:
Delegate Sub AddListItem_Delegate(ByVal [ListView] As ListView, ByVal [text] As Object)
Private Sub AddListItem(ByVal [ListView] As ListView, ByVal [text] As ListViewItem)
If [ListView].InvokeRequired Then
Dim MyDelegate As New AddListItem_Delegate(AddressOf AddListItem)
Me.Invoke(MyDelegate, New Object() {[ListView], [text]})
Else
ListView1.Items.Add([text])
End If
End Sub
正如您可能想象的那样,问题是列表视图的闪烁。任何人都可以帮我解决在后台工作中执行LockWindowUpdate(Me.Handle)命令的问题吗?我已经尝试创建一个新的委托但它不起作用(错误,我不太了解vb.net)。
谢谢!
答案 0 :(得分:0)
请确保不要过于频繁地调用此代码,这对UI线程的运行状况非常不利。如果你每秒调用它超过1000次,那么UI线程将完全停止响应。它不会再重绘,也不会响应鼠标点击。
如果要添加大量项目,请确保首先将它们存储在List(Of ListViewItem)中,然后调用Invoke()并将它们添加到列表视图中,由BeginUpdate()和EndUpdate()括起来。 LockWindowUpdate()没有意义。
这将照顾大多数闪烁,但不会完全消除它。 ListView类支持双缓冲,但默认情况下不启用。要解决此问题,请在项目中添加一个新类并粘贴下面显示的代码。编译。从工具箱顶部删除新控件,替换现有的ListView。
Public Class MyListView
Inherits ListView
Public Sub New()
Me.DoubleBuffered = True
End Sub
End Class