Wpf анимации из кода - PullRequest
       1

Wpf анимации из кода

2 голосов
/ 31 октября 2011

Было несколько похожих тем, но я не нашел решения своей проблемы. Это мой первый пост здесь.
Вот в чем дело:

Viewport3D viewPort3D;

GeometryModel3D geometryModel = new GeometryModel3D();  
Transform3DGroup transform3DGroup = new Transform3DGroup();

...

// Rotation
RotateTransform3D rotateTransform3D = new RotateTransform3D();   
AxisAngleRotation3D axisAngleRotation3d = new AxisAngleRotation3D();  
axisAngleRotation3d.Axis = new Vector3D(0, 1, 0);  
axisAngleRotation3d.Angle = angle;  
rotateTransform3D.Rotation = axisAngleRotation3d;  
transform3DGroup.Children.Add(rotateTransform3D);  

// Translation  
TranslateTransform3D translateTransform3D = new TranslateTransform3D();  
translateTransform3D.OffsetX = offsetX;
transform3DGroup.Children.Add(translateTransform3D);  

// Adding transforms  
geometryModel.Transform = transform3DGroup;  

Model3DGroup model3DGroup = new Model3DGroup();
model3DGroup.Children.Add( image.getGeometryModel3D() );

modelVisual3D.Content = model3DGroup;
viewPort3D.Children.Add( modelVisual3D );

А теперь я хочу сделать перевод с использованием раскадровки (потому что позже я хочу добавить также вращение к этой раскадровке):

Storyboard s = new Storyboard();

Transform3DGroup transform3DGroup = model3DGroup.Children.ElementAt(current).Transform as Transform3DGroup;

for (int j = 0; j < transform3DGroup.Children.Count; ++j)
{
   if (transform3DGroup.Children.ElementAt(j) is TranslateTransform3D)
   {
      TranslateTransform3D translation = transform3DGroup.Children.ElementAt(j) as TranslateTransform3D;

      DoubleAnimation doubleAnimation = new DoubleAnimation();
      doubleAnimation.From = 0;
      doubleAnimation.To = 2;
      doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(1));
      doubleAnimation.AutoReverse = true;
      doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;

      s.Children.Add(doubleAnimation);
      s.Duration = new Duration(TimeSpan.FromSeconds(1));

      Storyboard.SetTarget(doubleAnimation, model3DGroup.Children.ElementAt(current));
      Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Model3D.Transform).(Transform3DGroup.Children)[1].(TranslateTransform3D.OffsetX)"));

      s.Begin(); // Exception during the execution.
   }
}

Исключение в последней строке:

Значение свойства [[Unknown] 'в пути '(Model3D.Transform). (Transform3DGroup.Children) [1]. (TranslateTransform3D.OffsetX)' указывает на неизменный экземпляр 'System.Windows.Media.Media3D.TranslateTransform3D'.

Я взял PropertyPath аналогично пути, сгенерированному в blend 4.

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 31 октября 2011

Я думаю, что так как translate tranform 3d является неизменным экземпляром, необходимо указать, что он должен изменяться во время рендеринга / перевода.

Я думаю,

  1. Мы можем предоставить x:Name этому неизменному TranslateTransform3D объекту, чтобы сделать его изменяемым.

  2. Привязать к его свойству, чем оживить его.

Например, в вашем случае

        NameScope.SetNameScope(this, new NameScope());
        this.RegisterName("AxisRotation", MyAxisRotation3DObject.Rotation);
        this.RegisterName("TranslateTransformation", MyTranslation3DObject);

Таким образом, мы присваиваем имена объектам Axis Rotation 3D и Translate Transform 3D, а затем в двойной анимации обозначаем их как Storyboard.SetTargetName(.., "AxisRotation") и Storyboard.SetTargetName(.., "TranslateTransformation") и получаем доступ к их прямым свойствам.такие как Storyboard.SetTargetProperty(.., new PropertyPath("Angle")) и Storyboard.SetTargetProperty(.., new PropertyPath("OffsetX")) соответственно

0 голосов
/ 31 октября 2011

В вашей ошибке указано, что TranslateTransform3D является неизменным, что означает, что его нельзя изменить. И вы пытаетесь анимировать одно из его свойств, поэтому вы получили ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...