WPF MultiDataTrigger的Tag属性仅触发一次

时间:2019-02-20 11:10:58

标签: c# wpf

我遇到一种情况,我需要根据选择属性选择要在事件触发器上播放的动画。有两个事件总是按照从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。为什么触发器只触发一次?还是有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

我认为原因是您的情节提要板持续运行。您应该先停止情节提要,然后再运行另一个。 看看这个答案:WPF Fade In / Out only runs once

在另一件事上,我会说使用故事板设置简单的值实在是太过分了。考虑使用附加行为或TriggerAction。 有关详细信息和示例,请参见此处:Setting a property with an EventTrigger

答案 1 :(得分:0)

原因是标记的值没有再次更改。 它是“ 1”,然后又是“ 1”。

如果值不变,则Dependency属性不会运行任何回调。 我建议在设置“ 1”之前先设置“ 0”,这将不执行任何操作,然后将实际触发器设置为“ 1”。

希望这会有所帮助