【发布时间】:2013-07-01 20:20:14
【问题描述】:
我有一个DataTemplate 用于ItemsControl,它工作正常。在DataTemplate 中有一个DataTrigger,其中包含一个BeginStoryboard EnterAction。我正在尝试将情节提要的 Completed 事件连接到代码中的某些内容,特别是数据对象上的方法,但我可以灵活处理——目前我只想让它运行任何一段 C# 代码动画完成后。
为Completed XAML 属性指定一个值不会编译,因为该属性是在模板内定义的,因此没有特定的方法可以连接。所以我需要使用后面的代码来手动连接事件。
为此,我使用 Snoop 查看了应用程序,试图找到膨胀模板 Storyboards 在逻辑或可视树中的最终位置。到目前为止,我所看到的只是为每个项目创建的ContentControl,并设置了ContentTemplate。每个ContentControl 的Content 属性设置为其对应的数据对象。 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>
【问题讨论】:
标签: wpf xaml storyboard datatemplate