WPF DataTemplate:充气故事板的位置

时间:2013-07-01 09:58:33

标签: wpf xaml storyboard datatemplate

我有DataTemplate ItemsControl这是正常的。 DataTrigger中有DataTemplate,其中包含BeginStoryboard EnterAction。我试图将故事板的Completed事件连接到背后的代码中,特别是关于数据对象的方法,但我可以灵活处理 - 目前我只是想让它运行任何一块动画完成后的C#代码。

指定Completed XAML属性的值不会编译,因为在模板中定义了属性,因此没有特定的方法可以连接到。所以我需要使用后面的代码来手动连接事件。

为此,我查看了使用Snoop的应用程序,试图找到逻辑或可视树中膨胀模板Storyboard的最终位置。到目前为止,我只能看到为每个项目创建的ContentControl,其ContentTemplate集。每个Content的{​​{1}}属性设置为其对应的数据对象。 ContentControl属性包含ContentTemplate集合,其中包含Triggers,最终包含EnterActions。我的问题是,所有项目是否为他们的Storyboard属性共享一个模板实例,或者他们各自获得自己的副本?如果他们共享一个,那么膨胀的触发器和故事板在哪里创建?

我已经提取了我的XAML的相关部分:

ContentTemplate

1 个答案:

答案 0 :(得分:1)

在这种情况下,我通常更喜欢在DataContext正在申请的项目Storyboard中加入一个bool,并称之为AnimationCompleted

现在将Storyboard修改为

<Storyboard x:Key="ConnectToMe" Duration="0:0:2.5" FillBehavior="Stop">
  <DoubleAnimation To="400" Duration="0:0:1.5" Storyboard.TargetName="IconHighlight1" Storyboard.TargetProperty="Height" FillBehavior="Stop" />
  <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="DataContext.AnimationCompleted" FillBehavior="HoldEnd">
    <DiscreteBooleanKeyFrame Value="False" KeyTime="0:0:0" />
  </BooleanAnimationUsingKeyFrames>
  <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="DataContext.AnimationCompleted" FillBehavior="HoldEnd">
    <DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:2.5" />
  </BooleanAnimationUsingKeyFrames>
</Storyboard>

我们在动画的结束点将bool AnimationCompleted切换为true。因此,在AnimationCompleted的属性设置器中,检查传入的value是否为True并从那里触发相应的函数/方法