2010-11-11 24 views
0

我有一個使用自定義控件作爲ListBox.ItemTemplate DataTemplate的ListBox。ListBox Dropshadow動畫

我想我的第一個問題(和其他都是相關的)是如何在列表框中爲子代創建獨特的名稱?

我問,因爲我試圖從代碼隱藏調用ListBox.Resource Storyboard。我得到的錯誤是找不到MyShadow。

<MyControl.BitmapEffect> 
    <DropShadowBitmapEffect x:Name="MyShadow" ShadowDepth="5" Opacity="0.5" Softness="0.5" /> 
</MyControl.BitmapEffect> 

我的XAML的故事板是

<Storyboard x:Key="FocusedShadow"> 
    <!-- Shadow Animation--> 
    <DoubleAnimation 
     Storyboard.TargetName="MyShadow" 
     Storyboard.TargetProperty="ShadowDepth" 
     To="15" 
     Duration="0:0:.14" /> 
</Storyboard> 

我想我需要做的是指定TARGETNAME的項目(涉及回到第一個問題)的名稱和TargetProperty應該MyShadow.Shadowdepth但我不知道如何從這裏到達那裏。

在代碼中,我正在做一個storyboardobject.begin(this);

TIA

回答

0

我有一個非常類似的問題。基本上,(我在想)在完全創建可視化樹之前,您正試圖進行動畫製作。我用兩種技術解決了這個問題。

首先,我使用優先級ApplicationIdle(這種方式我們非常肯定可視化樹已經創建)提高我的動畫事件(在我的xaml中觸發觸發器),我打電話給UpdateLayout()之前,我提出的事件。

第二,我正在訪問該對象,如下所示:var child = this.GetTemplatedChild("MyCanvas")以確保在嘗試提升我的事件之前畫布實際上存在。 (不是很確定這個幫助,但異常走我加了這個之後) 這裏是我的示例代碼:

this.Dispatcher.BeginInvoke(new Action(() => 
    { 
     this.UpdateLayout(); 
     if (this.Visibility == System.Windows.Visibility.Visible) 
     { 
     var bzyCanvas = this.GetTemplateChild("BusyCanvas"); 
     if (bzyCanvas != null) 
      this.RaiseEvent(new RoutedEventArgs(AnimationStarted)); 
     } 
    }),System.Windows.Threading.DispatcherPriority.ApplicationIdle); 
+0

我不認爲這是我在這裏的問題,因爲我在鼠標懸停事件調用此。在代碼隱藏事件中,我找到了故事板資源和Beginanimation。一切都已創建,它只是不知道如何找到DropshadowBitmapEffect。 – Jeff 2010-11-11 15:45:21

+0

如果我將這段代碼(xaml)放置在DataTemplate中的mouseevent觸發器中,它可以工作,但是當我將故事板移動到列表框資源並從代碼中調用它時,我會遇到失敗。 – Jeff 2010-11-11 15:51:59

+0

嗯,那真的很奇怪。 – 2010-11-11 16:02:45