我有一个运行良好的DataTemplate
for ItemsControl
。其中有一个DataTrigger
包含DataTemplate
一个BeginStoryboard
EnterAction
。我正在尝试Completed
将情节提要的事件连接到代码中的某些内容,特别是数据对象上的方法,但我可以灵活处理 - 目前我只希望它在动画时运行任何 C# 代码已完成。
为 XAML 属性指定值Completed
不会编译,因为该属性是在模板内定义的,因此没有特定的方法可以连接。所以我需要使用后面的代码来手动连接事件。
为此,我使用 Snoop 查看了应用程序,试图找到膨胀模板在逻辑或可视树中Storyboard
的最终位置。到目前为止,我所看到的只是ContentControl
为每个项目创建了一个及其ContentTemplate
集合。每个的Content
属性都ContentControl
设置为其对应的数据对象。该ContentTemplate
属性包含包含和最终的Triggers
集合。我的问题是,是否所有项目都为其属性共享一个模板实例,还是每个项目都有自己的副本?如果他们共享一个,那么膨胀的触发器和故事板是在哪里创建的?EnterActions
Storyboard
ContentTemplate
我已经提取了我的 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>