Если вы хотите создать это в WPF, просто создайте стиль с раскадровкой.В окнах формы вам нужно использовать таймер.
Причина, по которой цикл не работал для вас, заключается в том, что цикл работал в том же потоке, что и пользовательский интерфейс, поэтому пользовательский интерфейс не обновлялся до тех пор, пока цикл не был завершен.Чтобы анимировать эффект в формах Windows, вы должны позволить завершить функцию события, чтобы пользовательский интерфейс мог обновить, а затем снова вызвать вашу функцию для следующего кадра.Это то, что делает элемент таймера.
Я создал демонстрационную программу с двумя анимированными кнопками.Чтобы создать кнопки с анимированными цветами фона, я сначала настраиваю начальный цвет, конечный цвет, величину, которую я хочу, чтобы цвет менял в каждом кадре, кнопку, над которой находится мышь, и ход перехода каждой кнопки.Я добавил это последнее, чтобы кнопки могли постепенно переходить назад после того, как мышь была над чем-то другим.
private Color startColor = Color.AliceBlue;
private Color endColor = Color.BlueViolet;
private double step = 0.01;
private Button lastOver = null;
private Dictionary<Button, double> transitionProgress = new Dictionary<Button, double>();
Затем я прикрепил обработчики событий обеих моих кнопок к одним и тем же функциям, функции ниже,Первый использует ContainsKey, чтобы я мог анимировать больше кнопок, просто назначив их этим функциям обработчика событий.
private void demoButton_MouseHover(object sender, EventArgs e)
{
if (sender != lastOver)
{
lastOver = (Button)sender;
if (!transitionProgress.ContainsKey(lastOver))
{
transitionProgress[lastOver] = 0.0;
}
}
}
private void demoButton_MouseLeave(object sender, EventArgs e)
{
lastOver = null;
}
Затем я создал таймер со следующим обработчиком событий.Он проходит через каждую кнопку и перемещает ее в зависимости от того, находится ли мышь над этой кнопкой.Он также обновляет цвет фона только в том случае, если он был изменен для повышения производительности.
private void styleUpdate_Tick(object sender, EventArgs e)
{
for (int i = 0; i < transitionProgress.Count; i++)
{
Button button = transitionProgress.Keys.ElementAt(i);
bool changing = false;
if (button == lastOver)
{
if (transitionProgress[button] < 1.0)
{
transitionProgress[button] = Math.Min(1.0, transitionProgress[button] + step);
changing = true;
}
}
else
{
if (transitionProgress[button] > 0.0)
{
transitionProgress[button] = Math.Max(0.0, transitionProgress[button] - step);
changing = true;
}
}
if (changing)
{
double progress = transitionProgress[button];
button.BackColor = Color.FromArgb(
(int)Math.Floor((endColor.R - startColor.R) * progress + startColor.R),
(int)Math.Floor((endColor.G - startColor.G) * progress + startColor.G),
(int)Math.Floor((endColor.B - startColor.B) * progress + startColor.B)
);
}
}
}
Таймер должен быть включен и установлен интервал 16
this.styleUpdate.Enabled = true;
this.styleUpdate.Interval = 16;
this.styleUpdate.Tick += new System.EventHandler(this.styleUpdate_Tick);
Это похоже намного кода, но чтобы добавить его к другой кнопке, вам просто нужно еще две строки кода.
this.yourButtonName.MouseLeave += new System.EventHandler(this.demoButton_MouseLeave);
this.yourButtonName.MouseHover += new System.EventHandler(this.demoButton_MouseHover);