0

我有一个运行良好的DataTemplatefor ItemsControl。其中有一个DataTrigger包含DataTemplate一个BeginStoryboard EnterAction。我正在尝试Completed将情节提要的事件连接到代码中的某些内容,特别是数据对象上的方法,但我可以灵活处理 - 目前我只希望它在动画时运行任何 C# 代码已完成。

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

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

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

<Style TargetType="{x:Type m:MyControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type m:MyControl}">
                <Grid Name="ControlRoot" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
                    <!-- ... -->
                    <ItemsControl ItemsSource="...">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate DataType="{x:Type m:MyDataType}">
                                <Grid>
                                    <Ellipse Name="IconHighlight1" Fill="{DynamicResource GoldRadialFade}" Width="70" Height="70" StrokeThickness="0" Opacity="0"/>
                                </Grid>
                                <DataTemplate.Triggers>
                                    <DataTrigger Binding="{Binding Highlighted}" Value="True">
                                        <DataTrigger.EnterActions>
                                            <BeginStoryboard HandoffBehavior="Compose">
                                                <Storyboard Name="ConnectToMe" Duration="0:0:2.5" FillBehavior="Stop">
                                                    <DoubleAnimation To="400" Duration="0:0:1.5" Storyboard.TargetName="IconHighlight1" Storyboard.TargetProperty="Height" FillBehavior="Stop" />
                                                </Storyboard>
                                            </BeginStoryboard>
                                        </DataTrigger.EnterActions>
                                    </DataTrigger>
                                </DataTemplate.Triggers>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
4

1 回答 1

1

在这种情况下,我通常更愿意在您申请DataContext的 Item 中有一个 bool 并说 call itStoryboardAnimationCompleted

现在通过修改你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>

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

于 2013-07-01T10:34:48.030 回答