WP7 - анимация заканчивается слишком рано и не остается эффекта - PullRequest
2 голосов
/ 28 августа 2011

Я сделал анимацию, чтобы повернуть мой элемент управления, но когда он срабатывает, он просто переходит в конечную позицию, а затем сразу возвращается в исходную позицию.

Элементы управления сделаны из кода и представляют собой текстовые поля со следующими свойствами:

FontSize = 45;
TextAlignment = TextAlignment.Center;
Widh = 40;
Heigh = 45;

Я храню текстовые поля в массиве, поэтому я запускаю анимацию с помощью следующего кода:

foreach (TextBlock b in arrayOfTextBoxes)
{
    Rotate(b);
}

Анимация:

public static void Rotate(UIElement target)
{
        var projection = new PlaneProjection();
        target.Projection = projection;

        DoubleAnimation da = new DoubleAnimation();
        da.From = 0;
        da.To = 90;
        da.Duration = TimeSpan.FromSeconds(0.25);
        da.AutoReverse = false;

        Storyboard.SetTargetProperty(da, new PropertyPath(PlaneProjection.RotationZProperty));
        Storyboard.SetTarget(da, projection);

        Storyboard sb = new Storyboard();
        sb.Children.Add(da);

        EventHandler eh = null;
        eh = (s, args) =>
        {
            projection.RotationZ = 90;
            sb.Stop();
            sb.Completed -= eh;
        };
        sb.Completed += eh;

        sb.Begin();
}

РЕДАКТИРОВАТЬ : Теперь я наверняка знаю, в чем проблема.У меня один (иногда два) Диспетчер Таймс тикает в фоновом режиме каждую секунду.Когда я отключаю их, проблема исчезла.Но я не могу этого сделать, потому что мне нужно, чтобы они измерили время.Остановка их перед тем, как я запускаю анимацию, и их повторный запуск не помогают.// DispetcherTimers делают это:

        void tikac_Tick(object sender, EventArgs e)
    {
        herniCas += new TimeSpan(0, 0, 1);
    }

1 Ответ

2 голосов
/ 28 августа 2011

Раскадровки анимации обычно сохраняют последнее значение «до тех пор, пока они не будут остановлены».Они не изменяют постоянно действительную стоимость имущества.Они просто меняют отображаемое в данный момент значение (разве свойства зависимостей не прекрасны?)Не останавливайте раскадровку, если вы хотите, чтобы значение оставалось измененным, или явно устанавливайте его в коде при изменении анимации.

Анимация в вашем примере настолько быстрая, что она просто очень быстро заканчивается (время запуска раскадровок может составлять несколько кадров, и любой промежуток времени между ними пропускается, поскольку анимации являются интерполяциями с фиксированным временем, а не конкретными кадрами).

...