C# 无限彩虹背景循环

C# Infinite Rainbow Background Loop

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

谢谢。

我认为它是 windows 表格,你不能做 Thread.Sleep(n) 因为它 Sleep 是你的表格,你需要的是 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();
}

除此之外肯定看起来很可怕, 你的无限循环会阻塞 gui 线程,所以 gui 永远不会更新。 这意味着您的程序没有时间应用更改后的背景颜色。

假设您正在使用 Windows 表单,您应该以 250 毫秒的间隔在表单中放置一个计时器。 然后将您的 Colors 存储在一个数组中,列出任何内容并使其成为该表单的成员...

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
}

因此,在每个计时器间隔上,您将进一步显示一种颜色,并在显示最后一种颜色时将其重置。