Анимация не работает правильно с триггерами данных - PullRequest
0 голосов
/ 18 августа 2011

У меня есть выпадающий список, который связан с перечислением анимаций. У нас есть такое требование, что если в поле со списком выбран стиль анимации, соответствующая анимация должна быть запущена в текстовом блоке. У меня есть 3 анимации, а именно: исчезать, масштабировать и мигать. Пока мигание работает нормально, затухание и масштабирование не работают. он работает только в первый раз, когда экран загружается, а затем после этого, даже если выбор изменяется на затухание / масштабирование, анимация не запускается. Как будто сейчас, я запустил анимацию, используя триггер данных, и именно тогда эта проблема начала появляться, но анимация была запущена отлично, когда мы попытались использовать триггер события. Мой код, как показано ниже. Может ли кто-нибудь помочь мне в том, что я делаю неправильно и как это можно исправить.

Анимация:

        <Storyboard x:Key="Fade">
        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)">
            <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
        </ObjectAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="Scale">
        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)">
            <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
        </ObjectAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
<Storyboard x:Key="Blink">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
                <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
            </DoubleAnimationUsingKeyFrames>
            <ObjectAnimationUsingKeyFrames RepeatBehavior="3x" Storyboard.TargetProperty="(UIElement.Visibility)">
                <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
                <DiscreteObjectKeyFrame KeyTime="0:0:0.25" Value="{x:Static Visibility.Collapsed}"/>
                <DiscreteObjectKeyFrame KeyTime="0:0:0.5" Value="{x:Static Visibility.Visible}"/>
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>

Триггеры комбинированного списка, текстового блока и данных, используемые для запуска анимации:

         <telerik:RadComboBox x:Name="animationTypeComboBox"
                                 Foreground="White"  
                                 Width="180" 
                                 ItemsSource="{Binding Source={StaticResource AnimationTypeEnumValues}}" 
                                 SelectedItem="{Binding SelectedAnimationType, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" 
                                 VerticalAlignment="Center" >
            </telerik:RadComboBox>
            <TextBlock x:Name="testMsg" Text="Test message" VerticalAlignment="Center" HorizontalAlignment="Center" RenderTransformOrigin="0.5,0.5">
                <TextBlock.RenderTransform>
                        <TransformGroup>
                            <ScaleTransform/>
                            <SkewTransform/>
                            <RotateTransform/>
                            <TranslateTransform/>
                        </TransformGroup>
                    </TextBlock.RenderTransform>
                 <TextBlock.Style>
                    <Style TargetType="TextBlock" BasedOn="{StaticResource Subheading}">    
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding SelectedAnimationType}" Value="{x:Static ent:AnimationType.Fade}">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard Storyboard="{StaticResource Fade}"/>
                                </DataTrigger.EnterActions>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding SelectedAnimationType}" Value="{x:Static ent:AnimationType.Scale}">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard Storyboard="{StaticResource Scale}"/>
                                </DataTrigger.EnterActions>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding SelectedAnimationType}" Value="{x:Static ent:AnimationType.Blink}">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard Storyboard="{StaticResource Blink}"/>
                                </DataTrigger.EnterActions>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>

1 Ответ

3 голосов
/ 18 августа 2011

Я сделал несколько изменений в вашем коде, чтобы он работал в моей локальной системе .... вот решение вашей проблемы ..

<TextBlock x:Name="testMsg" Text="Test message" VerticalAlignment="Center" HorizontalAlignment="Center" RenderTransformOrigin="0.5,0.5">
                <TextBlock.RenderTransform>
                        <TransformGroup>
                            <ScaleTransform/>
                            <SkewTransform/>
                            <RotateTransform/>
                            <TranslateTransform/>
                        </TransformGroup>
                    </TextBlock.RenderTransform>
                 <TextBlock.Style>
                    <Style TargetType="TextBlock">    
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding SelectedItem,ElementName=AnimStyles}" Value="Fade">
                                <DataTrigger.EnterActions>
                                      <RemoveStoryboard BeginStoryboardName="Scale"/>
                                    <RemoveStoryboard BeginStoryboardName="Blink"/>
                                    <BeginStoryboard  Name="Fade">
                                         <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
                                            </ObjectAnimationUsingKeyFrames>
                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
                                                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                                                <EasingDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
                                            </DoubleAnimationUsingKeyFrames>
                                             </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.EnterActions>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding SelectedItem,ElementName=AnimStyles}" Value="Scale">
                                <DataTrigger.EnterActions>
                                     <RemoveStoryboard BeginStoryboardName="Fade"/>
                                    <RemoveStoryboard BeginStoryboardName="Blink"/>
                                    <BeginStoryboard Name="Scale">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
                                            </ObjectAnimationUsingKeyFrames>
                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
                                                <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                                                <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="1"/>
                                            </DoubleAnimationUsingKeyFrames>
                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
                                                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                                                <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="1"/>
                                            </DoubleAnimationUsingKeyFrames>
                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
                                                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                                                <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="1"/>
                                            </DoubleAnimationUsingKeyFrames>
                                         </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.EnterActions>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding SelectedItem,ElementName=AnimStyles}" Value="Blink">
                                <DataTrigger.EnterActions>
                                    <RemoveStoryboard BeginStoryboardName="Fade"/>
                                    <RemoveStoryboard BeginStoryboardName="Scale"/>
                                    <BeginStoryboard Name="Blink">
                                         <Storyboard>
                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
                                                <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                                            </DoubleAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames RepeatBehavior="3x" Storyboard.TargetProperty="(UIElement.Visibility)">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
                                                <DiscreteObjectKeyFrame KeyTime="0:0:0.25" Value="{x:Static Visibility.Collapsed}"/>
                                                <DiscreteObjectKeyFrame KeyTime="0:0:0.5" Value="{x:Static Visibility.Visible}"/>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.EnterActions>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
        </TextBlock>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...