Мой опыт основан на 2D-анимации, но я думаю, что проблема та же.
По какой-то глупой причине (возможно, связанной с нездоровым фокусом на XAML), раскадровки могут анимировать только объекты Freezable, просматривая ихпо имени.(См. Пример в Обзор раскадровок .) Таким образом, несмотря на то, что вы предоставляете ссылку на свой объект поворота при вызове Storyboard.SetTarget (анимация, вращение), раскадровка хочет запомнить и использовать только имя, котороеу него нет.
Решение:
- Создайте область именования вокруг элемента, который будет управлять преобразованием.
- Вызовите RegisterName () для каждого Freezableанимируемый объект.
- Передайте элемент в Storyboard.Begin ()
Что сделает ваш код похожим на это (не проверено):
FrameworkContentElement element = new FrameworkContentElement();
NameScope.SetNameScope(element, new NameScope());
RotateTransform3D tempTransform = (RotateTransform3D)wheel.Transform;
AxisAngleRotation3D rotation = (AxisAngleRotation3D)tempTransform.Rotation;
element.RegisterName("rotation", rotation);
Storyboard storyboard = new Storyboard();
DoubleAnimation animation = new DoubleAnimation();
animation.By = defaultAngle;
animation.Duration = TimeSpan.FromSeconds(.5);
Storyboard.SetTarget(animation, rotation);
Storyboard.SetTargetProperty(animation, new PropertyPath("Angle"));
storyboard.Children.Add(animation);
storyboard.Duration = animation.Duration;
storyboard.Begin(element, HandoffBehavior.Compose);
Ничего из этого не требуется в XAML, потому что ваши объекты автоматически регистрируются.
РЕДАКТИРОВАТЬ: Но потом я решил, что вы можете упростить вещи, вообще не используя раскадровку:
var T = new TranslateTransform(40, 0);
Duration duration = new Duration(new TimeSpan(0, 0, 0, 1, 0);
DoubleAnimation anim = new DoubleAnimation(30, duration);
T.BeginAnimation(TranslateTransform.YProperty, anim);