注意:我已经问了相关问题(有一个被接受的答案):如何结合DataTrigger和Trigger?
我认为我需要结合一个EventTrigger
和一个DataTrigger
来实现我想要的效果:
- 当我的ListBox中出现一个项目时,它应该闪烁几秒钟
- 如果该项是“Critical”,则应保持突出显示
目前我拥有一个如下所示的DataTemplate:
<DataTemplate DataType="{x:Type Notifications:NotificationViewModel}">
<Grid HorizontalAlignment="Stretch">
<Border Name="Background" CornerRadius="8" Background="#80c0c0c0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
<Border Name="Highlight" CornerRadius="8" Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
<!-- snip actual visual stuff -->
<Grid.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation x:Name="LoadedAnimation"
Storyboard.TargetName="Highlight"
Storyboard.TargetProperty="Opacity"
From="0" To="1"
RepeatBehavior="5x"
Duration="0:00:0.2"
AutoReverse="True" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Grid.Triggers>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsCritical}" Value="True">
<Setter TargetName="LoadedAnimation" Property="RepeatBehavior" Value="5.5x" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
这个想法是使用EventTrigger来使Highlight
边框的不透明度在0和1之间重复动画,从而在项目首次加载时吸引用户的注意力。 DataTrigger
确定要执行动画的次数。如果视图模型报告该项目IsCritical
,则会执行5.5次动画(以不透明度1结束),否则执行5次动画(以不透明度0结束)。
但是上面的XAML无法工作,因为DataTrigger的setter出现以下错误:
未在VisualTree中找到名称为'LoadedAnimation'的子级。
说得对。那么,除了使用自定义值转换器或将动画计数放在视图模型上并绑定到它之外,我还有哪些选择?