Проблема с примитивной анимацией WindowsForm
По какой-то причине не работает код плавного движения кнопки. Сам код
private static void AnimationTransform (Button cont, Point firstPoint, Point endPoint, int frame, float seconds)
{
cont.Location = firstPoint;
seconds = seconds * 1000;
float delay = seconds / frame;
Point distance = new Point(endPoint.X - firstPoint.X, endPoint.Y - firstPoint.Y);
(float, float) frameDistance = (distance.X / frame, distance.Y / frame);
(float, float) currPoint = (firstPoint.X, firstPoint.Y);
for (int i = 0; i < frame; i ++)
{
Thread.Sleep((int)delay);
currPoint = (currPoint.Item1 + frameDistance.Item1, currPoint.Item2 + frameDistance.Item2);
cont.Location = new Point((int)currPoint.Item1, (int)currPoint.Item1);
}
cont.Location = endPoint;
}
private void button10_Click(object sender, EventArgs e)
{
AnimationTransform(button11, button10.Location, button11.Location, 50, 6);
}
В чем проблема?
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Чтобы форма могла обновляться, пока выполняется код, нужно сделать ожидание в анимайции асинхронным.
using System.Threading.Tasks;
private static async Task AnimationTransform(Button cont, Point firstPoint, Point endPoint, int frame, float seconds)
{
cont.Location = firstPoint;
float delay = seconds * 1000 / frame;
Point distance = new Point(endPoint.X - firstPoint.X, endPoint.Y - firstPoint.Y);
(float, float) frameDistance = ((float)distance.X / frame, (float)distance.Y / frame);
(float, float) currPoint = (firstPoint.X, firstPoint.Y);
for (int i = 0; i < frame; i++)
{
await Task.Delay((int)delay);
currPoint = (currPoint.Item1 + frameDistance.Item1, currPoint.Item2 + frameDistance.Item2);
cont.Location = new Point((int)Math.Round(currPoint.Item1), (int)Math.Round(currPoint.Item2));
}
cont.Location = endPoint;
}
private async void button10_Click(object sender, EventArgs e)
{
try
{
await AnimationTransform(button11, button10.Location, button11.Location, 50, 6);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}