【发布时间】:2019-07-14 01:26:11
【问题描述】:
我有一种情况,我需要根据选择属性选择要在事件触发器上播放的动画。有两个事件总是按 A 然后 B 的顺序触发。
我想出的解决方案是使用 EventTrigger for A 将元素的 Tag 属性设置为 1,在 EventTrigger for BI 上将其设置回 0。然后我在元素样式中有多个 MultiDataTrigger Tag 属性值和 selection 属性有条件匹配,触发相应的动画。
这在第一轮中一切正常,A 触发第一个动画,B 触发第二个动画。但是,当事件 A 再次触发时,MultiDataTrigger 似乎不再触发。为了增加混乱,B 的动画继续工作。只要事件在 A 和 B 之间交替,就会播放事件 B 动画,但不会播放事件 A。
<Window x:Class="WpfTriggerTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfTriggerTest"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid x:Name="rootLayout">
<local:TestElement x:Name="testElement">
<local:TestElement.Resources>
<Storyboard x:Key="TriggerA">
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Tag" Duration="0:0:0">
<ObjectAnimationUsingKeyFrames.KeyFrames>
<DiscreteObjectKeyFrame KeyTime="0:0:0" >
<DiscreteObjectKeyFrame.Value>
<sys:Int32>1</sys:Int32>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames.KeyFrames>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="TriggerB">
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Tag" Duration="0:0:0">
<ObjectAnimationUsingKeyFrames.KeyFrames>
<DiscreteObjectKeyFrame KeyTime="0:0:0" >
<DiscreteObjectKeyFrame.Value>
<sys:Int32>0</sys:Int32>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames.KeyFrames>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="AnimA">
<ObjectAnimationUsingKeyFrames Storyboard.Target="{x:Reference rootLayout}" Storyboard.TargetProperty="Background" Duration="0:0:0">
<ObjectAnimationUsingKeyFrames.KeyFrames>
<DiscreteObjectKeyFrame>
<DiscreteObjectKeyFrame.Value>
<SolidColorBrush Color="Red" />
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames.KeyFrames>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="AnimB">
<ObjectAnimationUsingKeyFrames Storyboard.Target="{x:Reference rootLayout}" Storyboard.TargetProperty="Background" Duration="0:0:0">
<ObjectAnimationUsingKeyFrames.KeyFrames>
<DiscreteObjectKeyFrame>
<DiscreteObjectKeyFrame.Value>
<SolidColorBrush Color="Green" />
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames.KeyFrames>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</local:TestElement.Resources>
<local:TestElement.Triggers>
<EventTrigger RoutedEvent="local:TestElement.TriggerA">
<BeginStoryboard Storyboard="{StaticResource TriggerA}" />
</EventTrigger>
<EventTrigger RoutedEvent="local:TestElement.TriggerB">
<BeginStoryboard Storyboard="{StaticResource TriggerB}" />
</EventTrigger>
</local:TestElement.Triggers>
<local:TestElement.Style>
<Style TargetType="{x:Type local:TestElement}">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Tag, RelativeSource={RelativeSource Self}}" Value="1" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource AnimA}" />
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Tag, RelativeSource={RelativeSource Self}}" Value="0" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource AnimB}" />
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</local:TestElement.Style>
</local:TestElement>
<Button Content="TriggerA" HorizontalAlignment="Left" Margin="51,45,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click" />
<Button Content="TriggerB" HorizontalAlignment="Left" Margin="143,45,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
</Grid>
</Window>
发布的代码已经过简化,我从 MultiDataTrigger 中删除了第二个条件,因为它不会影响手头的问题。
我已经监控了 Tag 属性值,并且在事件触发时它被正确设置为 1 和 0。为什么触发器只会触发一次?或者,有没有更好的方法来解决这个问题?
【问题讨论】: