NOTE I have asked the related question (with an accepted answer): How to combine DataTrigger and Trigger?
我想我需要结合一个
EventTrigger
和 DataTrigger
实现我所追求的:目前我有一个看起来像这样的 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
确定动画的次数。如果 View 模型报告项目 IsCritical
然后动画发生 5.5 次(以不透明度 1 结束),否则动画发生 5 次(以不透明度 0 结束。)但是,上面的 XAML 不起作用,因为 DataTrigger 的 setter 失败:
Child with Name 'LoadedAnimation' not found in VisualTree.
很公平。因此,对于使用自定义值转换器或将动画计数放在 View 模型上并绑定(bind)到它,我有什么选择?
最佳答案
在这种情况下,我会使用行为而不是触发器。您可以编写一个行为,将事件处理程序附加到关联对象的加载事件,然后应用动画。该行为可能会公开一些属性,我会公开一个 AnimationCount (int) 属性,该属性告诉行为在与其关联的元素上重复动画多少次。然后,您可以将此属性绑定(bind)到 View 模型中的 IsCritical 属性,并使用值转换器将 false 转换为 5,将 true 转换为 5.5
希望这可以帮助
关于.net - 如何结合 DataTrigger 和 EventTrigger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1679391/