闪烁背景颜色变化

时间:2012-02-23 06:09:14

标签: c# .net winforms flicker

我有一个大面板,里面有很多儿童面板。这些子面板内部是两个具有透明背景的文本字段。它本质上是从头开始构建的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 个答案:

答案 0 :(得分:2)

请在此处查看我的回答:

WinForms - Does the Form.DoubleBuffered property influence controls placed on that form?

基本上,在父控件上设置DoubleBuffered并不会导致子控件。尝试我在答案中提出的黑客,看看这是否适合你。