использовать триггер данных для управления раскадровкой, но триггер только один раз - PullRequest
2 голосов
/ 14 сентября 2011

Я использую триггер данных для управления некоторыми раскадровками, но он может быть активирован только один раз.

 <Style x:Key="PropertyTriggerExampleButtonStyle" TargetType="{x:Type Button}">           
        <Setter Property="Width" Value="200" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding para}" Value="0">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width"
              To="500" Duration="0:0:1" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>                 
            </DataTrigger>
            <DataTrigger Binding="{Binding para}" Value="1">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width"
              To="200" Duration="0:0:1" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>                   
            </DataTrigger>            
        </Style.Triggers>
    </Style>
<Button Style="{StaticResource PropertyTriggerExampleButtonStyle}">
        button width will be changed
    </Button>

Параметр para - это переменная (уже реализованная интерфейсом INotifyPropertyChanged), которой будет управлять другая кнопка. его значение равно 0 или 1.

Но когда я нажимаю кнопку, чтобы изменить значение параметра, раскадровка срабатывает только один раз для каждого значения (0 и 1). Это никогда не сработает позже.

Если я добавлю вторую раскадровку в тег ExitActions первого триггера данных. это будет хорошо работать. Но у меня более 2-х раскадровок нужно контролировать ......

следующий код работает хорошо, но мне нужно контролировать много раскадровок (более 2) в соответствии с различными значениями ....

<Style.Triggers>
            <DataTrigger Binding="{Binding para}" Value="0">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width" To="500" Duration="0:0:1" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>     
                <DataTrigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width" To="200" Duration="0:0:1" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.ExitActions>
            </DataTrigger>                       
        </Style.Triggers>

Ответы [ 2 ]

3 голосов
/ 20 сентября 2012

У меня была такая же проблема, затем я дал Timeline.FillBehavior="Stop", который работал для меня.

Проверка: Microsoft - ссылка на класс временной шкалы - Timeline.FillBehavior Свойство

2 голосов
/ 14 сентября 2011

Вы можете использовать System.Windows.Interaction.Interactivity с условием для запуска раскадровок.

XMLNS: я = "http://schemas.microsoft.com/expression/2010/interactivity" XMLNS: е = "http://schemas.microsoft.com/expression/2010/interactions"

<Border x:Name="brd" MinWidth="20" Height="20">
<TextBlock Text="{Binding Text}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<Border.Resources>
    <Storyboard x:Key="Story" Duration="1000"
            Storyboard.TargetName="brd"
            Storyboard.TargetProperty="Background">
        <ObjectAnimationUsingKeyFrames>
            <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="#81bb8c" />
            <DiscreteObjectKeyFrame KeyTime="0:0:0.9" Value="{x:Null}" />
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="Story2" Duration="1000"
            Storyboard.TargetName="brd"
            Storyboard.TargetProperty="Background">
        <ObjectAnimationUsingKeyFrames>
            <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="#bb818c" />
            <DiscreteObjectKeyFrame KeyTime="0:0:0.9" Value="{x:Null}" />
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
</Border.Resources>
<i:Interaction.Triggers>
    <ei:DataTrigger Binding="{Binding LastClick}" Value="0"
            Comparison="GreaterThan">
        <ei:ControlStoryboardAction 
             Storyboard="{StaticResource Story}" ControlStoryboardOption="Play" />
    </ei:DataTrigger>
    <ei:DataTrigger Binding="{Binding LastClick}" Value="0"
            Comparison="LessThan">
        <ei:ControlStoryboardAction 
             Storyboard="{StaticResource Story2}" ControlStoryboardOption="Play" />
    </ei:DataTrigger>
</i:Interaction.Triggers></Border>
...