为什么这个无限的彩虹背景循环不起作用,我在C#Forms中运行这个代码,想法是在你点击button1后获得背景颜色变化。我尝试了差异无限循环制造商,如:for(;;)。但这是代码:
private void button1_Click(object sender, EventArgs e)
{
while (true)
{
this.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(250);
this.BackColor = System.Drawing.Color.DarkRed;
System.Threading.Thread.Sleep(250);
this.BackColor = System.Drawing.Color.Orange;
System.Threading.Thread.Sleep(250);
this.BackColor = System.Drawing.Color.Yellow;
System.Threading.Thread.Sleep(250);
this.BackColor = System.Drawing.Color.Green;
System.Threading.Thread.Sleep(250);
this.BackColor = System.Drawing.Color.DarkGreen;
System.Threading.Thread.Sleep(250);
this.BackColor = System.Drawing.Color.Blue;
System.Threading.Thread.Sleep(250);
this.BackColor = System.Drawing.Color.DarkBlue;
System.Threading.Thread.Sleep(250);
this.BackColor = System.Drawing.Color.Violet;
}

谢谢。
答案 0 :(得分:4)
我认为这是Windows格式,你不能Thread.Sleep(n)
,因为它睡觉是你的形式,你需要的是Timer
,一种解决问题的快捷方式
public List<Color> colors = new List<Color> {
Color.Red,
Color.DarkRed,
Color.Orange
};
private int current;
private Timer t = new Timer();
public Form1() {
InitializeComponent();
t.Interval = 250;
t.Tick += T_Tick;
}
private void T_Tick(object sender, System.EventArgs e) {
this.BackColor = colors[current++]; //change to rainbows other colors
current %= colors.Count; // rainbow does not have infinite color, we should start again somewhere
}
*your_click_method* {
t.Start();
}
答案 1 :(得分:0)
除此之外肯定会看起来很可怕, 你的无限循环将阻止gui线程,因此gui将永远不会更新。 这意味着您的程序没有时间应用更改的背景颜色。
假设您使用的是Windows窗体,则应将计时器放入表单,间隔为250毫秒。 然后将您的颜色存储在数组中,列出任何内容并使其成为该表单的成员...
private List<Color> rainbowColors = new List<Color>()
{
Color.Red,
Color.DarkRed,
....
};
您还需要一个索引来了解您当前正在显示的颜色。
private int rainbowIndex;
在您的计时器事件上执行以下操作:
private void timer_Elapsed(object sender, EventArgs e)
{
this.BackColor = this.rainbowColors[this.rainbowIndex++];
this.rainbowIndex = this.rainbowIndex % this.rainbowColors.Count;
this.Invalidate(); //Really change the formcolor
}
因此,在每个计时器间隔,您将进一步颜色,如果显示最后一种颜色,则重置它。