C#无限彩虹背景环

C#无限彩虹背景环,c#,loops,infinite,C#,Loops,Infinite,为什么这个无限彩虹背景循环不起作用,我正在以C#形式运行这段代码,我的想法是在点击按钮1后改变背景颜色。我尝试了不同的无限循环生成器,比如:for(;)。但代码如下: private void按钮1\u单击(对象发送者,事件参数e) { while(true) { this.BackColor=System.Drawing.Color.Red; 系统线程线程睡眠(250); this.BackColor=System.Drawing.Color.DarkRed; 系统线程线程睡眠(250);

为什么这个无限彩虹背景循环不起作用,我正在以C#形式运行这段代码,我的想法是在点击按钮1后改变背景颜色。我尝试了不同的无限循环生成器,比如:for(;)。但代码如下:

private void按钮1\u单击(对象发送者,事件参数e)
{
while(true)
{
this.BackColor=System.Drawing.Color.Red;
系统线程线程睡眠(250);
this.BackColor=System.Drawing.Color.DarkRed;
系统线程线程睡眠(250);
this.BackColor=System.Drawing.Color.Orange;
系统线程线程睡眠(250);
this.BackColor=System.Drawing.Color.Yellow;
系统线程线程睡眠(250);
this.BackColor=System.Drawing.Color.Green;
系统线程线程睡眠(250);
this.BackColor=System.Drawing.Color.DarkGreen;
系统线程线程睡眠(250);
this.BackColor=System.Drawing.Color.Blue;
系统线程线程睡眠(250);
this.BackColor=System.Drawing.Color.DarkBlue;
系统线程线程睡眠(250);
this.BackColor=System.Drawing.Color.Violet;

}
我认为这是windows窗体,您不能执行
线程。睡眠(n)
因为它是您的窗体,您需要的是
计时器
,一种快速而肮脏的方法来解决您的问题

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();
}
public List colors=新列表{
颜色,红色,
颜色,黑色,
颜色,橙色
};
私有电流;
专用定时器t=新定时器();
公共表格1(){
初始化组件();
t、 间隔=250;
t、 滴答声+=滴答声;
}
私有void T_Tick(对象发送方,System.EventArgs e){
this.BackColor=colors[current++];//更改为彩虹其他颜色
当前%=颜色。计数;//彩虹没有无限的颜色,我们应该在某个地方重新开始
}
*您的点击方法*{
t、 Start();
}

我认为这是windows窗体,您不能执行
线程。睡眠(n)
因为它是您的窗体,您需要的是
计时器
,一种快速而肮脏的方法来解决您的问题

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();
}
public List colors=新列表{
颜色,红色,
颜色,黑色,
颜色,橙色
};
私有电流;
专用定时器t=新定时器();
公共表格1(){
初始化组件();
t、 间隔=250;
t、 滴答声+=滴答声;
}
私有void T_Tick(对象发送方,System.EventArgs e){
this.BackColor=colors[current++];//更改为彩虹其他颜色
当前%=颜色。计数;//彩虹没有无限的颜色,我们应该在某个地方重新开始
}
*您的点击方法*{
t、 Start();
}

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

假设您使用的是Windows窗体,您应该在窗体上放置一个间隔为250ms的计时器。 然后将颜色存储在数组中,列出所有颜色,并使其成为该表单的成员

private List<Color> rainbowColors = new List<Color>()
        {
          Color.Red,
          Color.DarkRed,
          ....
        };
在计时器事件上执行以下操作:

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
}

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

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

假设您使用的是Windows窗体,您应该在窗体上放置一个间隔为250ms的计时器。 然后将颜色存储在数组中,列出所有颜色,并使其成为该表单的成员

private List<Color> rainbowColors = new List<Color>()
        {
          Color.Red,
          Color.DarkRed,
          ....
        };
在计时器事件上执行以下操作:

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
}


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

您运行此代码的应用程序类型是什么?此“不工作”是如何表现出来的?此代码在哪里运行?在
OnPaint
?因为彩虹不是无限的。它们是由水的光线折射引起的。(换句话说,您需要添加更多信息-您正在构建什么类型的应用程序等)您从不给UI显示任何内容的时间;睡眠也会暂停UI线程..插入一个
this.Refresh()
每次颜色更改后!-顺便说一句,通过darkred从红色变为橙色是不可能的。redorange更合理,不是吗?运行此代码的应用程序类型是什么?这“不起作用”是怎么回事显示自身?此代码在哪里运行?在
OnPaint
?因为彩虹不是无限的。它们是由来自水的光的折射引起的。(换句话说,您需要添加更多信息-您正在构建什么类型的应用程序等)你从来没有给UI显示任何东西的时间;睡眠也会暂停UI线程。在每次颜色更改后插入一个
this.Refresh()
。-顺便说一句,通过darkred从红色变为橙色是不可能的。redorange更合理,不是吗?我想你忘了增加索引。更简单:
BackColor=rainbowColors[(rainbowIndex++)%彩虹色。计数]
同样正确,这是一个更干净的解决方案。@Rotem是的,这是一行,但当索引通过
int.Max
时会出现异常。@tetralobita您可以将
uint
未选中的
表达式一起使用,但您在回答中使用的方式更简单,可读性更强。我想您忘了增加我的值nt您的索引。更简单:
BackColor=rainbowColors[(rainbowIndex++)%rainbowColors.Count]
同样正确,这是一个更干净的解决方案。@Rotem是的,这是一行,但当索引通过
int.Max
时会出现异常。@tetralobita您可以将
uint
未选中的
表达式一起使用,但您在回答中使用的方式更简单,可读性更强。谢谢,但rainbow不需要o单击按钮1后开始,如:私有无效按钮1u单击(对象发送者,事件参数e){//here code}谢谢,但rainbow需要