我遇到一种情况,我需要根据选择属性选择要在事件触发器上播放的动画。有两个事件总是按照从A到B的顺序触发。
我想出的解决方案是使用A的EventTrigger将元素的Tag属性设置为1,在BI的EvenTrigger上将其设置为0。然后,我在元素样式中拥有多个MultiDataTriggers在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。为什么触发器只触发一次?还是有更好的方法来解决这个问题?
答案 0 :(得分:1)
我认为原因是您的情节提要板持续运行。您应该先停止情节提要,然后再运行另一个。 看看这个答案:WPF Fade In / Out only runs once
在另一件事上,我会说使用故事板设置简单的值实在是太过分了。考虑使用附加行为或TriggerAction。 有关详细信息和示例,请参见此处:Setting a property with an EventTrigger
答案 1 :(得分:0)
原因是标记的值没有再次更改。 它是“ 1”,然后又是“ 1”。
如果值不变,则Dependency属性不会运行任何回调。 我建议在设置“ 1”之前先设置“ 0”,这将不执行任何操作,然后将实际触发器设置为“ 1”。
希望这会有所帮助