常在Silverlight專案中,如果是經由Desinger透過Expression Blend拉出來的動畫Storyboard,一般應該都會直接把每個Storyboard的TargetName直接設死,所以如果有四個物件,要套用同一個動畫,可能就得要拉四次,不過其實這個是可以透過程式的協助來解決的,因為Storyboard(甚至Storyboard的Children)的Target,都是可以在執行期間重新設定的。
通常在Silverlight專案中,如果是經由Desinger透過Expression Blend拉出來的動畫Storyboard,一般應該都會直接把每個Storyboard的TargetName直接設死,所以如果有四個物件,要套用同一個動畫,可能就得要拉四次,不過其實這個是可以透過程式的協助來解決的,因為Storyboard(甚至Storyboard的Children)的Target,都是可以在執行期間重新設定的。
也就是說,Designer只要先設計好一個Storyboard,之後就可以透過程式,來讓其他的控制項也套用該動畫,以下就來為大家示範可以怎麼做吧~
為了方便Demo,我先以Blend在MainPage.xaml中放好一個下拉式選單(選單中放的是動畫目標的名稱),一個按鈕(用來撥放動畫),和四個Ellipse(要共用動畫的物件),等一下就用這些東西來做示範。
接著直接使用Blend對藍色的球做一個動畫,讓它向右邊滾。
產生的Storyboard xaml如下:
而Ellipse本身也會變成
這邊要注意,因為有套用Rotation,所以要用RenderTransformOrigin="0.5,0.5"這段來定義旋轉的中心點,其他三個球也要套用同一個動畫,所以手動將另外三個球也加上這個屬性吧。
再來就是真正的大工程了,我們要把Storyboard拔出來,讓動畫可以被共用,這個部份其實很簡單,只要把Storyboard那個Tag的區段剪下到App.xaml中的<Application.Resources>裡貼上,並且把Storyboard.TargetName="blueBall" d:IsOptimized="True"拿掉就行了(這樣做是為了讓整個應用程式中的Control都能使用這個Storyboard)。
貼過去的同時,我也一併將Storyboard1更名成moveBallStoryboard,然後將blueBall的<Ellipse.RenderTransform>整個拿掉,完成後的檔案會像下面這樣:
最後一步,幫按鈕加上Click事件的EventHandler吧!!接下來程式的部份就直接用註解來說明~
大功告成啦!!成品如下:
最後奉上專案原始碼,請自行取用: