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
}
因此,在每个计时器间隔上,您将进一步显示一种颜色,并在显示最后一种颜色时将其重置。
为什么这个无限彩虹背景循环不起作用,我 运行 这个代码在 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
}
因此,在每个计时器间隔上,您将进一步显示一种颜色,并在显示最后一种颜色时将其重置。