ListBox Dropshadow动画

时间:2010-11-11 15:30:39

标签: wpf animation datatemplate

我有一个ListBox,它使用自定义控件作为ListBox.ItemTemplate DataTemplate。

我想我的第一个问题(其余是相关的)是如何为列表框中的孩子创建唯一的名称?

我问,因为我试图从代码隐藏中调用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

1 个答案:

答案 0 :(得分:0)

我有一个非常类似的问题。基本上,(我在想)你在完全创建视觉树之前尝试动画。我用两种技术解决了这个问题。

首先,我使用优先级Dispatcher.BeginInvoke(...ApplicationIdle内部提升我的动画事件(在我的xaml中触发Trigger)(这样我们很确定视觉树已经被在我举起活动之前,我打电话给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);