عنوان:

‫مشکل چشمک زدن (Flicker) در کنترل ListView


نویسنده: وحید نصیری
تاریخ: ۱۳۸۷/۱۲/۰۹ ۱۰:۲۴:۳۰
آدرس: www.dntips.ir

با هر بار اضافه کردن یک سطر به ListView ، تمام ناحیه پس زمینه کنترل به روز شده و مشکل چشمک زدن (Flicker) آزار دهنده‌ای را پدید می‌آورد. راه حل‌های زیادی برای رفع این مشکل وجود دارد. برای مثال استفاده از متدهای BeginUpdate و EndUpdate قبل و پس از افزودن تعداد زیادی رکورد به یک ListView . اما اگر این کنترل توسط چند ترد در حال به روز رسانی باشد و هربار هم تعداد آیتم‌های اضافه شده آنچنان زیاد نباشد، این روش اثری نداشته و باز هم مشکل flickering وجود خواهد داشت.
رفع این مشکل راه حل بسیار ساده‌ای دارد که به شرح زیر است:

یک user control جدید ایجاد کنید، آن‌را از ListView به ارث برده و سپس سطر زیر را به constructor آن اضافه کنید:

this.DoubleBuffered = true;

اکنون از این ListView سفارشی بجایlistView استاندارد استفاده کنید، مشکل برطرف می‌شود!

public partial class CustomListView : ListView
{
public CustomListView()
{
this.DoubleBuffered = true;
}
}
شبیه به همین مورد را جهت کنترل ListBox نیز می‌توان پیاده سازی کرد

نظرات

  • مهمان در ۱۳۸۷/۱۲/۱۰ ۲۳:۰۸:۰۰
    فکر میکنم این DoubleBuffered از چیزهایی باشد که از دلفی وارد سی شارپ شده است.
  • وحید نصیری در ۱۳۸۷/۱۲/۱۱ ۰۲:۰۵:۰۰
    فرقی نمی‌کند برای استفاده از کنترل‌های استاندارد ویندوزی از چه محصور کننده‌ای استفاده شود. شما حتی اگر از QT نسخه‌ی ویندوزی هم استفاده کنید، این کتابخانه محصور کننده‌ای خواهد بود برای API ویندوز.