C#无限彩虹背景循环

时间:2017-06-20 07:16:04

标签: c# loops infinite

为什么这个无限的彩虹背景循环不起作用,我在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;
    }




谢谢。

2 个答案:

答案 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
}

因此,在每个计时器间隔,您将进一步颜色,如果显示最后一种颜色,则重置它。