@Pr00f

C# WPF почему происходит случайное смещение элементов при замедлении анимации?

Делаю слайдер с передвигающимися картинками (несколько border->image внутри canvas).
В цикле перебираются все картинки и смещаются внутри канваса на несколько пикселей.
Со временем это смещение уменьшается на 1 пиксель и тогда происходит какой-то рассинхрон и расстояние между некоторыми картинками начинает разниться.

0be0f584c9f1fa260df518d251fa7d42-full.pn
new Thread(() =>
{
    while (true)
    {
        double uptime = DateTime.Now.Subtract(_startedAt).TotalMilliseconds;

        // Замедление анимации
        if (uptime < 10 * 1000)
            _step = 10;
        else if (uptime < 21 * 1000)
            _step = 20 - (int)uptime / 1000;
        else
        {
            return;
        }

        Dispatcher.Invoke(() =>
        {
            // Передвижение картинок
            foreach (var item in Items.ToArray())
            {
                double left = (double)item.GetValue(LeftProperty);
                left -= _step;

                item.SetValue(LeftProperty, left);

                // Перемещение прокрученной картинки в конец
                if (left <= -140)
                {
                    Items.Remove(item);
                    double offset = Items.Count * 140;
                    item.SetValue(LeftProperty, offset);
                    Items.Add(item);
                }
            }
        });

        Thread.Sleep(1000 / 60);
    }
}).Start();


А если смещение (_step) сделать статическим и не уменьшать его, тогда работает все правильно.
Из-за чего такое может быть? Ведь смещение обновляется сразу у всех элементов внутри массива?
  • Вопрос задан
  • 65 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Pr00f Автор вопроса
Немного прояснилась ситуация. Разброс картинок происходит когда указан шаг смещения, который не делится без остатка на ширину картинки (например, смещение на 8 пикселей, с шириной картинки в 140).
Но не могу понять, как это влияет на разброс. Позиция картинок все равно сбрасывается каждый раз, когда они выходят за границы канваса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы