Wpf动画从代码
本文关键字:代码 动画 Wpf | 更新日期: 2023-09-27 18:12:56
有一些类似的线程,但我没有找到我的问题的解决方案。这是我在这里的第一个帖子。
是这样的:
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进行转换(因为稍后我想在storyboard中添加旋转功能):
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中生成的路径。
谢谢你的帮助。
我认为,因为translate transform 3d是一个不可变的实例,所以必须指出,在渲染/翻译发生时,它应该是可变的
我想我们可以将
x:Name
提供给不可变的TranslateTransform3D
对象,使其可变
。
NameScope.SetNameScope(this, new NameScope());
this.RegisterName("AxisRotation", MyAxisRotation3DObject.Rotation);
this.RegisterName("TranslateTransformation", MyTranslation3DObject);
通过这种方式,我们给轴旋转3D和平移变换3D对象命名,然后在双重动画中将它们称为Storyboard.SetTargetName(.., "AxisRotation")
和Storyboard.SetTargetName(.., "TranslateTransformation")
,并访问它们的直接属性,如Storyboard.SetTargetProperty(.., new PropertyPath("Angle"))
和Storyboard.SetTargetProperty(.., new PropertyPath("OffsetX"))
resp
您的错误说明TranslateTransform3D
是不可变的,这意味着,它不能被改变。当你试图给它的一个属性动画时,就会出现错误