2011-10-31 30 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'的不可變實例。

我帶的PropertyPath類似於混合生成的路徑4.

感謝您的任何幫助。

回答

0

我認爲,因爲translate tranform 3d是一個不可變的實例,所以必須指出它在呈現/翻譯時應該是可變的。

我猜

  1. 我們可以提供x:Name到不可變對象TranslateTransform3D,使其可變。

  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是不可變的,也就是說,它不能被改變。而且你正在試圖對它的一個屬性進行動畫處理,因此得到了錯誤。

+0

現在我得到異常:無法解析屬性路徑'TranslateTransform3D.OffsetX'中的所有屬性引用。驗證適用的對象是否支持這些屬性。 和 Storyboard.SetTargetProperty(doubleAnimation,new PropertyPath(「(TranslateTransform3D.OffsetX)」)); 沒有任何反應。 – Mat38