今天在公司遇到一個神奇的情況:我們的HIE在ListBox的DataTemplate中定義了一個Storyboard,而負責撰寫程式的同仁在試著播放該動畫的時候,試了好幾種方式,就是沒辦法順利的針對某一個ListBox中的Item播放動畫....
今天在公司遇到一個神奇的情況:我們的HIE在ListBox的DataTemplate中定義了一個Storyboard,而負責撰寫程式的同仁在試著播放該動畫的時候,試了好幾種方式,就是沒辦法順利的針對某一個ListBox中的Item播放動畫,於是來跟我討論。雖然我個人的經驗,處理這種類似的需求,還是以Trigger來實作會比較方便,但是身為工程師的我,不認輸不投降的個性又開始在我的心中大喊「一定要試出來!!!!」。經過幾個小時的瘋狂測試,總算被我試出一個方式了!!~這就列出來和大家分享,也做為自己的筆記。
先來直接看看透過Blend建立出來的Xaml檔(如果在ListBox的ItemTemplate編輯模式中建立了Storyboard,該Storyboard就會像以下Xaml一樣,被放在DataTemplate.Resources標籤裡):
Xaml的部份很合理,也很正常,沒什麼問題,而且這樣寫的話,名為Bright的Storyboard照理說應該可以供所有ListBox中的項目使用,但是真的要透過C#去針對ListBox中的某個項目播放動畫的時候,該怎麼做呢?
透過ItemTemplate的Resource取出Storyboard物件很簡單,但是,要怎麼去設定Storyboard的Target為我們想要的那個項目呢?因為有DataBinding的關係,如果直接去取得ListBox的SelectedItem,只會得到資料的Instance,而不是用來顯示的Control,所以是沒辦法拿來當Target使用的。
所以~我們就得繞個路,設法取得ListBox中透過DataTemplate生成的控制項,才能正常的撥放動畫;這時候,VisualTreeHelper就又派上用場了!!
讓我們來看看CodeBehind的cs檔:
這樣做之後,我們就可以開心的抓取DataTemplate中的動畫來玩啦!!
來享受一下最後的成果吧!!
最後,一樣附上專案的原始檔,請自行服用: