【发布时间】:2019-03-17 13:40:55
【问题描述】:
使用 Button-Paint-Event 按钮不会在 for 循环的每次迭代中更新。但是每次迭代都会平滑地更新表单或面板。
因此,在执行此代码时,Button 以默认颜色开始,然后在 for 循环完成后,显示颜色数组中的最后一种颜色。 它不会随着每次迭代而更新。
我的问题:有人知道,为什么每次迭代都没有更新 Button,但其他控件使用相同的代码?
void Main()
{
Color[] colors = new Color[10]
{
Color.White, Color.Red, Color.Blue, Color.Green, Color.Black,
Color.Purple, Color.Brown, Color.Yellow, Color.Gray, Color.Lime
};
Button button = new Button();
button.FlatStyle = FlatStyle.Flat;
button.Paint += (sender, e) =>
{
for (int i = 0; i < 10; i++)
{
e.Graphics.FillRectangle(
new SolidBrush(colors[i]),
new RectangleF(0, 0, button.Width, button.Height));
Thread.Sleep(100);
Application.DoEvents();
}
};
Form form = new Form();
form.Controls.Add(button);
form.Show();
}
【问题讨论】:
-
Paint 事件很特别。 - 不要尝试在 Paint 事件中制作动画。您无法控制它,应该让系统使用它,包括任何优化。您可以将该循环移到外面并在每次睡眠后调用 Invalidate 或按照建议使用计时器,这是动画的正常方式..
-
为什么我无法控制它?我可以实现不同的方法来应对不同的不同情况。除了按钮问题之外,我还没有遇到任何问题。
-
因为系统也需要调用它;并且在优化它时会很随意。顺便说一句:10 * 100 ms = 1second
-
"10 * 100ms = 1 秒。"...所以?这个例子是为了解决问题和问题。这不是最终的实现,只是一个简化版本。基础的 Paint 事件仍然会被调用,这只是“额外的”。
标签: c# forms button paint doevents