2012-12-30 63 views
0

在我的代码中,我正在绘制一个矩形作为面板的“框架”。我从XML文件中获取所需的颜色作为字符串(如“红色”,“蓝色”等)。在创建面板中,我使用此代码画吧:在面板上重绘矩形

    Strip.Paint += (sender, e) => 
       { 
        //MessageBox.Show(clr.ToString()); 
        Pen p = new Pen(Color.FromName(color), 2); // color is the string with name of the color 
        Rectangle r = new Rectangle(1, 1, 286, 36); 
        e.Graphics.DrawRectangle(p, r); 
        p.Dispose(); 
        e.Dispose(); 
       }; 

在是应该刷新矩形的方法,我加入这一行

Strip.Refresh(); 

这工作得很好。但是,每隔30秒使用计时器,我会检查颜色是否发生了变化,如果发生变化,请使用请求的颜色重新绘制矩形。第一个矩形绘制正确。但是,当计时器达到30时,它只是...嗯,我不知道如何描述它,这里是图片“刷新”后的功能: Printscreen of the application before and after refresh, excluding the text "normal state" and "after refresh" no edit, it really does this

+0

注意:它不应该是刷新后的红色,我不知道为什么它会把所有的东西都变成红色.. –

+0

好吧,我发现它为什么越过_all_,我在代码中有一个错误,判断颜色是否已经改变或不。所以对于那些不应该重绘的人来说没问题。但是当颜色改变时,它仍然会这样做。 –

回答

2

“红十字会”是什么时候发生的在OnPaint方法中抛出异常。这意味着您在Paint lambda中的代码中存在一个错误。

一旦抛出一个异常,就会设置一个内部标志,控件将不再尝试重新绘制自己。只有在应用程序再次运行或执行this trick时才会重置。

怀疑 知道你的情况的问题是,你不应该Dispose()PaintEventArgs对象在Paint事件。

一般来说,你不应该处理你自己没有创建的对象。

+0

随意将“嫌疑人”改为“知道”。 –

+0

@Hans你的愿望是我的命令。 – Rotem