2011-10-31 13 views
2

類似のスレッドがいくつかありましたが、問題の解決策が見つかりませんでした。それは私の最初の投稿です。
ここでは、ことだ:コードからのWpfアニメーション

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. 
    } 
} 

例外を最後の行に:

'[不明]'パスのプロパティ値 '(Model3D.Transform)。(Transform3D Group.Children)[1]。(TranslateTransform3D.OffsetX) ' は、 の不変インスタンスを指します。' System.Windows.Media.Media3D.TranslateTransform3D '。

私はブレンド4

で生成されたパスへのPropertyPathは、同様の取った任意の助けてくれてありがとう。

答えて

0

私は、翻訳tranform 3dは不変のインスタンスなので、レンダリング/翻訳が行われている間は変更可能でなければならないことを示す必要があると思います。

私たちはそれを可変にするために、その不変TranslateTransform3Dオブジェクトにx:Nameを供給することができ

  1. を推測します。

  2. アニメーション化するよりプロパティにバインドします。

たとえば、

 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としての直接のプロパティにアクセスこの方法です。

+0

はい!それは働いている。 s.Begin(this)を使用することだけを覚えておく必要があります。ありがとうございました。まもなくこのプロパティをバインドする方法を記述できますか? – Mat38

0

あなたのエラーはTranslateTransform3Dが不変であることを意味します。つまり、変更することはできません。そして、そのプロパティの1つをアニメートしようとしているので、エラーが発生します。

+0

例外が発生しました:プロパティパス 'TranslateTransform3D.OffsetX'のすべてのプロパティ参照を解決できません。該当するオブジェクトがプロパティをサポートしていることを確認します。 Storyboard.SetTargetProperty(doubleAnimation、新しいPropertyPath( "(TranslateTransform3D.OffsetX)")); 何も起こりません。 – Mat38

関連する問題