Мерцание при изменении цвета фона - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть большая панель со многими дочерними панелями внутри.Внутри этих дочерних панелей находятся два текстовых поля с прозрачным фоном.По сути, это ListBox, созданный с нуля.

То, что я пытаюсь сделать, это циклически проходить по каждой из этих дочерних панелей и менять цвет фона на выбранный, когда пользователь нажимает на одну из них.

Однако, когда я нажимаю на новую дочернюю панель, между старым цветом фона и новым цветом фона появляется очень заметное мерцание.

http://i.imgur.com/ROHYu.png

Примечание: индикаторсиний цвет - цвет подсветки, когда пользователь наводит курсор на панель.

Я попытался установить для DoubleBuffered значение true для главной панели и самой формы, но без особой удачи.Я также попытался установить для ControlStyles.AllPaintingInWmPaint, ControlStyles.UserPaint и ControlStyles.OptimizedDoubleBuffer также значение true.

public class List : Panel
{
    private Panel[] items;
    private Label[] header; // Children of items
    private Label[] footer; // Children of items

    public List()
    {
        SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        SetStyle(ControlStyles.UserPaint, true);
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

        AutoScroll = true;
        BackColor = Color.White;
        //DoubleBuffered = true;
        HorizontalScroll.Visible = false;
        HorizontalScroll.Enabled = false;
        VerticalScroll.Visible = true;
        VerticalScroll.Enabled = true;
    }

    public void renderItemsSelected(Color color)
    {
        for (int q = 0; q < itemsSelected.Count; q++)
        {
            int i = getPos();

            items[i].BackColor = color;
        }
    }
}

Поэтому мне было интересно, есть ли у кого-нибудь идеи?

1 Ответ

2 голосов
/ 23 февраля 2012

Смотрите мой ответ здесь:

WinForms - Влияет ли свойство Form.DoubleBuffered на элементы управления, размещенные в этой форме?

По сути, установка DoubleBuffered на родительский элемент управления не распространяется на дочерние элементы управления. Попробуйте взломать, который я предложил в этом ответе, посмотрите, работает ли он для вас.

...