본문 바로가기

.NET/WinForm

[WinForm] 컨트롤이 깜빡거리는 현상 해결 (DoubleBuffered 속성)

컨트롤이 많은 처리를 하거나, 컨트롤에 표시되는 데이터가 짧은 시간 안에 여러 번 갱신되어야 할 때 컨트롤이 깜빡거리는 현상을 볼 수 있다. (특히 ListView나 PictureBox 등)

이러한 현상을 해결하기 Control 클래스에는 위해 컨트롤의 이중 버퍼링을 활성화하여 깜빡임을 최소화하는 DoubleBuffered 속성이 존재하는데, 이 속성은 protected로 선언되어 있기 때문에 Control 클래스를 상속받아 생성되는 컨트롤에서 DoubleBuffered 속성에 접근하기 위한 별도의 방법을 public으로 제공하지 않는다면 속성 창을 통해서, 또는 참조 변수를 통해 접근할 수 없다.

 

Control 클래스의 DoubleBuffered 속성

 

그러나 Reflection 기능을 사용해서 이 속성을 켜줄 수 있다.

아래 코드를 폼의 생성자 등 적절한 위치에 넣어서 컨트롤을 사용하기 전에 DoubleBuffered 속성을 켜주면 깜빡임이 어느 정도 해소되는 것을 확인할 수 있을 것이다.

using System.Reflection; // GetProperty() 메서드 사용을 위해 추가

public partial class Form1 : Form
{
	public Form1()
    {
    	InitializeComponent();
        
        // ListView의 속성에서 DoubleBuffered 속성에 대한 정보를 검색하고, listView1의 해당 속성 값을 true로 변경
        listView1.GetType().GetProperty("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(listView1, true);
    }
}