2013-04-15 124 views
-1

我在WPF上製作遊戲SizzlingHot。我有一個用來加載水果圖像的畫布。當我點擊startButton時,它應該爲落下的果實創建一個雙動畫的故事板。我的方法如下代碼:創建故事板和雙動畫

NameScope.SetNameScope(this, new NameScope()); 

Cherry cherry = new Cherry(); // I get the image from this class 
// GameCanvas.Children.Add(cherry.FruitImage); // idk if this should be here and its invalid because the parameter in the parantheses shoud be UI element it does not allow BitmapImage      

DoubleAnimation myDoubleAnimation = new DoubleAnimation(100, 500, new Duration(TimeSpan.FromSeconds(5))); 
myDoubleAnimation.From = -150; 
myDoubleAnimation.To = 500;    

Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath("(Canvas.Top)")); 
Storyboard.SetTarget(myDoubleAnimation, cherry.FruitImage); 
Storyboard myStoryboard = new Storyboard();      

myStoryboard.Children.Add(myDoubleAnimation); 
GameCanvas.Resources.Add(myStoryboard,cherry.FruitImage); 

myStoryboard.Begin(this, true); 

當我運行它,在最後一行,它給了我一個

出現InvalidOperationException - 操作無效由於對象的當前階段。

我不明白什麼似乎是這裏的問題,當我調試它時,我可以看到圖像被發現。

+0

確切位置在哪裏,你添加的元素到畫布?你應該爲包含'Image'而不是'BitmapImage'源文件設置動畫。 –

+0

我添加它與Canvas.Children.Add(myImage),它不是它的源圖像,但彈出一個錯誤無法將位圖轉換爲System.Windows.UIElement。這不是將東西添加到畫布的正確方法嗎? –

回答

0

試試你的形象就這樣做,如果你還沒有:

image.BeginInit(); 
image.UriSource = new Uri(filename, UriKind.Relative); 
image.EndInit(); 
cherryImage.Source = image; 
+0

好的InvalidOperationException不顯示,但屏幕上仍然沒有顯示。 –

+0

請注意,這可能會寫得更短:'櫻桃圖像源。=新的BitmapImage(新Uri(文件名,UriKind.Relative));'。當您只想從Uri創建BitmapImage時,不需要BeginInit/EndInit。 – Clemens

0

如果cherry.FruitImageImage,你可以簡單地動畫這樣的:

cherry.FruitImage.BeginAnimation(
    Canvas.TopProperty, 
    new DoubleAnimation(-150, 500, TimeSpan.FromSeconds(5))); 

無需故事板。

1

只能將UIElement添加到Canvas,將BitmapImage直接添加到Canvas將不起作用。

一種選擇是在您的GameCanvas

實例添加一個動態Image並設置SourceFruitImage那麼你可以動畫/位置Image

Cherry cherry = new Cherry(); 

// Create host for BitmapImage 
Image imageHost = new Image { Source = cherry.FruitImage }; 
GameCanvas.Children.Add(imageHost); 

// Animate Image 
imageHost.BeginAnimation(Canvas.TopProperty, new DoubleAnimation(-150, 500, new Duration(TimeSpan.FromSeconds(5)))); 
+0

我現在明白這個工作非常感謝。 –

+0

@DimitarAndreev如果回答您的問題,請標記爲正確的答案 – Codeman