none
ListView如何避免或减少不断重绘产生的闪烁? RRS feed

答案

  • 需要给ListView设置双缓冲,代码如下(假设ListView1在Form1中):

    Imports System.Reflection
    
    Public Class Form1
    
        Public Sub New()
            ' 此调用是设计器所必需的。
            InitializeComponent()
            ' 在 InitializeComponent() 调用之后添加任何初始化。
            Dim mi As MethodInfo = GetType(Control).GetMethod("SetStyle", BindingFlags.Instance Or BindingFlags.NonPublic)
            mi.Invoke(ListView1, New Object() {ControlStyles.OptimizedDoubleBuffer, True})
        End Sub
    
    End Class

    注意一定要在窗体的构造函数里面给ListView设置双缓冲,在其他地方设置会无效。


    2014年4月23日 6:09

全部回复

  • ListView需要定时刷新各项状态,但由此而引发闪烁。如何避免?

    韩立学

    能给个可以重现这个问题的代码不?


    remember make the reply as answer and vote the reply as helpful if it helps.

    2014年4月23日 4:58
  • 需要给ListView设置双缓冲,代码如下(假设ListView1在Form1中):

    Imports System.Reflection
    
    Public Class Form1
    
        Public Sub New()
            ' 此调用是设计器所必需的。
            InitializeComponent()
            ' 在 InitializeComponent() 调用之后添加任何初始化。
            Dim mi As MethodInfo = GetType(Control).GetMethod("SetStyle", BindingFlags.Instance Or BindingFlags.NonPublic)
            mi.Invoke(ListView1, New Object() {ControlStyles.OptimizedDoubleBuffer, True})
        End Sub
    
    End Class

    注意一定要在窗体的构造函数里面给ListView设置双缓冲,在其他地方设置会无效。


    2014年4月23日 6:09
  • 谢谢回复!

    1.新建Form1

    2.添加ListView(.Dock=Fill,.View=List)

    3.添加Timer(.Enabled=True,.Interval=500)

    Public Class Form1

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.ListView1.BeginUpdate()
            For i = 1 To 100
                Me.ListView1.Items.Add(String.Format("列表项{0}", i))
            Next
            Me.ListView1.EndUpdate()
        End Sub

        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            Dim i As Integer = Rnd() * 100
            If i < 100 Then
                With Me.ListView1.Items(i)
                    If .BackColor = Color.Red Then
                        .BackColor = Color.White
                    Else
                        .BackColor = Color.Red
                    End If
                End With
            End If
        End Sub
    End Class


    韩立学

    2014年4月23日 6:27