C# бесконечная радуга фоновой петли
Почему этот бесконечный фоновый цикл радуги не работает, я запускаю этот код в 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 ответа
Я думаю, что это форма окна, вы не можете сделать 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();
}
Помимо этого, безусловно, будет выглядеть ужасно, ваш бесконечный цикл будет блокировать поток графического интерфейса, поэтому графический интерфейс никогда не будет обновляться. Это означает, что ваша программа не успевает применить измененный цвет фона.
Предположим, что вы используете Windows Forms, вы должны перетащить таймер на вашу форму с интервалом 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
}
Таким образом, на каждом интервале таймера вы идете на один цвет дальше и сбрасываете его, если отображается последний цвет.