[SOLUCIONADO] ¿Como evitar el efecto Flashing de un listview?

Iniciado por Eleкtro, 31 Diciembre 2012, 12:45 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

Cuando añado un item al listrview, hace un flash, un efecto muy desagradable.

Lo he intentado TODO, AddRange, Suspendlayout, Me.Doublebuffered, y por último BeginUpdate... Nada lo ha resuelto.

Código (vbnet) [Seleccionar]

for each file....

               Problems += 1
               str(0) = Problems
               str(1) = str(1).Substring(2)
               str(2) = File.FullName
               itm = New ListViewItem(str)
               InvokeControl(ListView, Sub(x) x.BeginUpdate())
               InvokeControl(ListView, Sub(x) x.Items.Add(itm))
               InvokeControl(ListView, Sub(x) x.EnsureVisible(ListView.Items.Count - 1))
               InvokeControl(ListView, Sub(x) x.EndUpdate())
end for...


Esto es otra variante del código, aquí noto cierta mejora (Flashes más cortos):
Código (vbnet) [Seleccionar]

  Private Sub AddItemToListView()
       str(0) = Problems
       str(1) = str(1).Substring(2)
       str(2) = File.FullName
       itm = New ListViewItem(str)
       ListView.SuspendLayout()
       InvokeControl(ListView, Sub(x) x.BeginUpdate())
       InvokeControl(ListView, Sub(x) x.Items.Add(itm))
       InvokeControl(ListView, Sub(x) x.EnsureVisible(ListView.Items.Count - 1))
       InvokeControl(ListView, Sub(x) x.EndUpdate())
       ListView.ResumeLayout()
       If NumberIsOdd(Problems) Then
           itm.BackColor = Color.FromArgb(15, 15, 15)
       Else
           itm.BackColor = Color.FromArgb(30, 30, 30)
       End If
   End Sub




Sé que el AddRange y BeginUpdate están pensados para añadir varios items, pero como podeis comprobar en el ejemplo es que yo necesito añadirlos uno por uno.

¿Que puedo hacer?








seba123neo

se llama flickering, y lo evitas creando una clase que herede del listview comun, y asi le podes asignar la variable DoubleBuffered.

Código (vbnet) [Seleccionar]
    Public Class ListviewEx
        Inherits ListView

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


eso te aparece como un control mas en la barra de herramientas y lo usas como un listview comun, si lo necesitas usar desde codigo tenes que declarlo de la siguiente forma:

Código (vbnet) [Seleccionar]
Private WithEvents lvPedidos As ListviewEx
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Eleкtro

OMG !

Seba, eso es la diferencia entre un verdadero experto, y todas las demás supuestas soluciones que salen en Google.

Mil gracias. ;D

Ya me has demostrado varias veces que se puede salir de apuros parecidos heredando controles, la próxima vez intentaré eso antes de preguntar,
Lo que no llego a comprender es porque el control original no tiene el DoubleBuffered ON, maldito Microsoft, en fin!!.

Un saludo.








spiritdead

Cita de: EleKtro H@cker en 31 Diciembre 2012, 13:35 PM
OMG !

Seba, eso es la diferencia entre un verdadero experto, y todas las demás supuestas soluciones que salen en Google.

Mil gracias. ;D

Ya me has demostrado varias veces que se puede salir de apuros parecidos heredando controles, la próxima vez intentaré eso antes de preguntar,
Lo que no llego a comprender es porque el control original no tiene el DoubleBuffered ON, maldito Microsoft, en fin!!.

Un saludo.
los controles de windows son controles standards, por eso muchas veces se recurren a clases extendidas de las originales o simplemente controles de terceros :)
Facilitador De Tareas - Task Simplifier (FDT)