2013-01-12 32 views
0

有人可以幫我找出爲什麼這不起作用:動畫在WPF不運行3D

所有的
var story = new Storyboard {Duration = TimeSpan.FromSeconds(10)}; 

var meshBuilder = new MeshBuilder(); 
meshBuilder.AddCone(new Point3D(0, 0, 0), new Vector3D(0, 0, 1), 15, 10, 50, false, false, 20); 

var mesh = meshBuilder.ToMesh(); 
var geometryModel = new GeometryModel3D 
{ 
    Geometry = mesh, 
    Material = new DiffuseMaterial(new SolidColorBrush(Colors.DeepSkyBlue)), 
    BackMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.LightBlue)), 
}; 
var modelVisual = new ModelVisual3D { Content = geometryModel }; 
helixViewport.Children.Add(modelVisual); 

var scaleAnimation = new DoubleAnimation 
{ 
    BeginTime = TimeSpan.FromSeconds(1), 
    From = 1, 
    To = 2, 
    Duration = new Duration(TimeSpan.FromSeconds(10)) 
}; 
var scaleTransform3D = new ScaleTransform3D(1, 1, 2); 

var transform3DGroup = new Transform3DGroup(); 
transform3DGroup.Children.Add(scaleTransform3D); 

modelVisual.Transform = transform3DGroup; 

story.Children.Add(scaleAnimation); 
Storyboard.SetTargetProperty(scaleAnimation, new PropertyPath(ScaleTransform3D.ScaleZProperty)); 
Storyboard.SetTarget(scaleAnimation, modelVisual); 

story.Begin(); 

首先,我只是用HelixToolkit,在那之後我想擴展它創建一個圓錐體。動畫將持續10秒,並從第1秒和最後10秒開始。但是不執行動畫,縮放後視口僅顯示最終結果。 注意:這是整個代碼的簡化部分,實際代碼將有多個動畫應用於多個模型,每個動畫將在不同的時間開始。這就是爲什麼我想在這裏使用storyboard和BeginTime。請幫我找出我做錯了什麼。

+0

感謝Clemens的幫助,它現在正在工作中:只有2行需要更改:Storyboard.SetTargetProperty(scaleAnimation,new PropertyPath(「Transform.C承運[0] .ScaleZ「));和var scaleTransform3D = new ScaleTransform3D(1,1,1); –

回答

1

您正試圖在ModelVisual3D類型的對象上設置動畫ScaleTransform3D.ScaleZProperty,該對象沒有該屬性。您應該更改

var path = "Transform.Children[0].ScaleZ"; 
Storyboard.SetTargetProperty(scaleAnimation, new PropertyPath(path)); 
Storyboard.SetTarget(scaleAnimation, modelVisual); 

您也可以通過省略故事板來簡化代碼。只需撥打

scaleTransform3D.BeginAnimation(ScaleTransform3D.ScaleZProperty, scaleAnimation) 

此外,你應該爲1的ScaleZ值初始化scaleTransform3D,因爲你想從1動畫ScaleZ至2

var scaleTransform3D = new ScaleTransform3D(1, 1, 1); 

或默認的構造函數,因爲所有的刻度值默認爲1.

var scaleTransform3D = new ScaleTransform3D(); 
+0

嗨克萊門斯,我嘗試使用Storyboard.SetTarget(scaleAnimation,scaleTransform3D);但它不起作用。在我做這篇文章之前,我確實嘗試過scaleTransform3D.BeginAnimation(ScaleTransform3D.ScaleZProperty,scaleAnimation),但是動畫立刻開始,而不是從我設置的BeginTime開始 –

+0

是的,Storyboard可能無法工作,因爲動畫目標不是FrameworkElement。看到我的編輯,我已經改變了屬性路徑而不是動畫目標。儘管它仍然不是FrameworkElement。那麼,我不確定這一點。你可以仔細檢查'BeginAnimation'解決方案嗎? – Clemens

+0

你好克萊門斯,你的代碼拋出異常,但從我更改爲Storyboard.SetTarget(scaleAnimation,modelVisual); Storyboard.SetTargetProperty(scaleAnimation,new PropertyPath(「Transform.Children [0] .ScaleZ」));和動畫開始。但另一個奇怪的問題出現了:首先縮放後的結果出現,然後在BeginTime,動畫開始。爲什麼發生? –