2010-09-08 7 views
0

У меня есть небольшая проблема, я использую BackgroundWorker сделать много обработки и добавляет элементы в ListView с:vb.net - LockWindowUpdate и BackgroundWorker

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 

проблема заключается в том, как вы можете себе представить, мерцание ListView. Может ли кто-нибудь помочь мне с решением выполнить команду LockWindowUpdate (Me.Handle) в фоновой работе? Я пробовал создать новый делегат, но он не работает (ошибки, я не понимаю vb.net достаточно).

Спасибо!

ответ

0

Обязательно не вызывать этот код слишком часто, это очень вредно для здоровья нити пользовательского интерфейса. Если вы называете это более чем 1000 раз в секунду, поток пользовательского интерфейса перестанет отвечать полностью. Он больше не будет перерисовываться и не реагирует на щелчки мыши.

Если у вас есть большое количество элементов для добавления, убедитесь, что вы сначала сохранили их в списке (из списка ListViewItem), затем вызовите() и добавьте их в представление списка, заключенные в скобки с помощью BeginUpdate() и EndUpdate() , В LockWindowUpdate() нет смысла.

Это позаботится о большинстве мерцаний, но не устранит его полностью. Класс ListView поддерживает двойную буферизацию, но по умолчанию он не включен. Чтобы исправить это, добавьте новый класс в свой проект и вставьте код, показанный ниже. Компиляция. Отбросьте новый элемент управления сверху панели инструментов, заменив существующий ListView.

Public Class MyListView 
    Inherits ListView 

    Public Sub New() 
     Me.DoubleBuffered = True 
    End Sub 
End Class 
+0

Отлично, попробуй это и спасибо! – Joe