Проблема анимации WPF при использовании раскадровки из кода - PullRequest
3 голосов
/ 31 июля 2010

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

Я заставил его работать, используя BeginAnimation для свойства Rotation RotateTransform3D, которое я применил к карусели, но я не могу заставить работать версию Storyboard той же анимации.Причина, по которой мне нужна версия Storyboard, заключается в параметре HandOffBehavior.Compose, поскольку без него несколько нажатий кнопок «Далее» и «Предыдущий» приводят к смещенной карусели.

Вот код раскадровки:

RotateTransform3D tempTransform = (RotateTransform3D)wheel.Transform;
AxisAngleRotation3D rotation = (AxisAngleRotation3D)tempTransform.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(new FrameworkContentElement(), HandoffBehavior.Compose);

По какой-то причине этот код ничего не дает.Я последовал примерам, которые я имел к письму, поэтому я очень расстроен.Любая помощь очень ценится.Я также полностью открыт для использования BeginAnimation, если я могу повторить HandOffBehavior.Compose.

1 Ответ

1 голос
/ 31 декабря 2010

Мой опыт основан на 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...