Проблема с примитивной анимацией 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);
    }
}
→ Ссылка