Проблема
Суть проблемы в том, что вы вызываете stb.Begin (), а затем немедленно меняете News1.Width и т. Д. К сожалению, stb.Begin () негарантированный немедленный запуск анимации: иногда это происходит при обратном вызове диспетчера.
С вами происходит то, что при первом запуске вашей раскадровки stb.Begin () планирует обратный вызов диспетчера для запуска анимациии сразу же возвращается.Следующие четыре строки вашего кода обновляют значения:
News1.Center = new Point(250, 400);
News1.Orientation = 0;
News1.Width = 266;
News1.Height = 400;
Когда анимации фактически запускаются в обратном вызове диспетчера, они видят новые значения и используют их в качестве своих начальных значений.Это приводит к тому, что объект, кажется, сразу переходит к новому значению.
Например, changeWidth объявляет ключевой кадр, который анимирует значение до 266:
changeWidth.KeyFrames.Add(new EasingDoubleKeyFrame(266, ...
И позже начальная ширина устанавливается на266:
News1.Width = 266;
Таким образом, если раскадровка начинается с задержкой, ширина будет меняться от 266 до 266. Другими словами, она не изменится.Если позже вы используете другую анимацию, чтобы изменить News1.Width на значение, отличное от 266, а затем запустите анимацию changeWidth, она будет работать.
Ваша анимация moveCenter работает надежно, поскольку она фактически устанавливает значение From в текущее значение:
moveCenter.From = News1.ActualCenter;
moveCenter.To = new Point(250, 400);
Таким образом, анимация всегда начинается в старом центре, даже если News1.Center = new Point(250,400)
после запуска анимации.
Решение
Так же, как вы установили «От» в PointAnimation, вы также можете установить начальное значение в других ваших анимациях.Это делается путем добавления ключевого кадра в момент времени 0 с указанием текущей ширины:
changeWidth.Duration = TimeSpan.FromSeconds(1);
changeWidth.KeyFrames.Add(new DiscreteDoubleKeyframe(News1.Width, KeyTime.Paced));
changeWidth.KeyFrames.Add(new EasingDoubleKeyFrame(266, KeyTime.Paced));
Этот код использует тот факт, что KeyTime.Paced
автоматически приводит к 0% и 100%, если есть два ключевых кадра.Фактически, установка первого кадра как KeyFrame.Paced
всегда будет эквивалентна KeyTime.FromTimeSpan(TimeSpan.Zero)
.