如何在ScaleTransform动画后重置控件

时间:2017-05-31 01:48:20

标签: c# animation uwp storyboard windows-10-universal

我正在开发针对PC的Windows 10通用应用程序。我想重复运行一个动画(不是在“RepeatBehaviour”循环中,而是在发生其他事情后再次运行),但是我很难在动画完成后重置动画控件。

故事板中的一个动画是TranslateTransform。完成后,我可以在代码中使用Canvas.SetLeft和Canvas.SetTop重新定位控件。然而,在我使用ScaleTransform动画“消失”控件之后,控件仍然不可见,我无法再次显示它。更改控制高度和宽度不起作用。

在XAML中使用AutoReverse确实可以解决问题,但我不希望用户看到它。控件应该“消失”。我希望在下一次运行之前,在幕后重置代码中的控件。

我的故事板和我正在制作动画的边框控件如下所示。这第一次工作正常。图像以一些旋转飞过屏幕,然后消失。第二次图像不可见,直到比例变换再次运行。

我尝试在第一个关键帧之前添加另一个ScaleTransform动画,从0快速扩展到1(我尝试了“0”或“0.1”的持续时间),但由于某种原因打破了整个事情。

我想知道RenderTransformOrigin是否与此有关,但我不确定如何将它与TransformGroup一起使用。因此将其设置为(0.5,0.5)以使旋转居中。

任何帮助都将不胜感激。

 <Storyboard x:Name="myStoryboard">
        <DoubleAnimationUsingKeyFrames
                        Storyboard.TargetName="myImage"
                        Storyboard.TargetProperty="(Canvas.Top)"
                        EnableDependentAnimation="False">
                        <SplineDoubleKeyFrame x:Name="MyTopSpline"   KeyTime="0:0:1.9"/>
                    </DoubleAnimationUsingKeyFrames>

                    <DoubleAnimationUsingKeyFrames
                        Storyboard.TargetName="myImage"
                        Storyboard.TargetProperty="(Canvas.Left)"
                        EnableDependentAnimation="False"">
                        <SplineDoubleKeyFrame x:Name="MyLeftSpline" KeyTime="0:0:1.9"/>
                    </DoubleAnimationUsingKeyFrames>

                    <DoubleAnimation Storyboard.TargetName="myImage" 
                             Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(RotateTransform.Angle)" 
                             From="0" To="360" BeginTime="0:0:1.0" Duration="0:0:1.9" />

                    <DoubleAnimation Storyboard.TargetName="myImage"
                                      Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)" 
                             From="1" To="0" BeginTime="0:0:1.9" Duration="0:0:0.9" />
                    <DoubleAnimation Storyboard.TargetName="myImage"
                                      Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleY)" 
                             From="1" To="0" BeginTime="0:0:1.9" Duration="0:0:0.9"  />


</Storyboard>

  <Border Name="myImage"  Height="244" Width="244" Canvas.Left="200" Canvas.Top="100" Visibility="Collapsed" 
RenderTransformOrigin=".5,.5">
        <Border.RenderTransform>
            <TransformGroup>
                    <RotateTransform Angle="0" />
                    <ScaleTransform ScaleX="1" ScaleY="1" />
                </TransformGroup>
         </Border.RenderTransform>
</Border>

2 个答案:

答案 0 :(得分:2)

首先,让我们稍微清理你的代码。您应该使用名为TransformGroup的复合变换对象,而不是使用CompositeTransform,因为它更容易使用。别忘了给它起个名字。

<Border.RenderTransform>
    <CompositeTransform x:Name="myImageTransform" />
</Border.RenderTransform>

所以现在你的Storyboard应如下所示。请注意,我已向其添加了myStoryboard_Completed处理程序。

<Storyboard x:Name="myStoryboard"
            Completed="myStoryboard_Completed">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="myImage"
                                   Storyboard.TargetProperty="(Canvas.Top)">
        <SplineDoubleKeyFrame x:Name="MyTopSpline" KeyTime="0:0:1.9" />
    </DoubleAnimationUsingKeyFrames>

    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="myImage"
                                   Storyboard.TargetProperty="(Canvas.Left)">
        <SplineDoubleKeyFrame x:Name="MyLeftSpline" KeyTime="0:0:1.9" />
    </DoubleAnimationUsingKeyFrames>

    <DoubleAnimation Storyboard.TargetName="myImage"
                     Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)"
                     From="0"
                     To="360"
                     BeginTime="0:0:1.0"
                     Duration="0:0:1.9" />

    <DoubleAnimation Storyboard.TargetName="myImage"
                     Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)"
                     From="1"
                     To="0"
                     BeginTime="0:0:1.9"
                     Duration="0:0:0.9" />
    <DoubleAnimation Storyboard.TargetName="myImage"
                     Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)"
                     From="1"
                     To="0"
                     BeginTime="0:0:1.9"
                     Duration="0:0:0.9" />
</Storyboard>

在此处理程序中,您需要做的就是重置所有转换属性和画布偏移。

private void myStoryboard_Completed(object sender, object e)
{
    myImage.Visibility = Visibility.Collapsed;

    Canvas.SetTop(myImage, 100);
    Canvas.SetLeft(myImage, 200);

    myImageTransform.Rotation = 0;
    myImageTransform.ScaleX = myImageTransform.ScaleY = 1;
}

但这是一个更好的方法。

为什么不将所有逻辑包装在同一个Storyboard中,而不是在代码中执行某些操作?您只需使用DoubleAnimationUsingKeyFrames为每个动画定义开始值和结束值

<Storyboard x:Name="myStoryboard">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="myImage"
                                   Storyboard.TargetProperty="(Canvas.Top)">
        <SplineDoubleKeyFrame KeyTime="0:0:0" Value="100" />
        <SplineDoubleKeyFrame x:Name="MyTopSpline" KeyTime="0:0:1.9" Value="100" />
    </DoubleAnimationUsingKeyFrames>

    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="myImage"
                                   Storyboard.TargetProperty="(Canvas.Left)">
        <SplineDoubleKeyFrame KeyTime="0:0:0" Value="200" />
        <SplineDoubleKeyFrame x:Name="MyLeftSpline" KeyTime="0:0:1.9" Value="200" />
    </DoubleAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)"
                                   Storyboard.TargetName="myImage">
        <EasingDoubleKeyFrame KeyTime="0" Value="0" />
        <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0" />
        <EasingDoubleKeyFrame KeyTime="0:0:2.9" Value="360" />
    </DoubleAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)"
                                   Storyboard.TargetName="myImage">
        <EasingDoubleKeyFrame KeyTime="0" Value="1" />
        <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1" />
        <EasingDoubleKeyFrame KeyTime="0:0:1.9" Value="1" />
        <EasingDoubleKeyFrame KeyTime="0:0:2.8" Value="0" />
    </DoubleAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)"
                                   Storyboard.TargetName="myImage">
        <EasingDoubleKeyFrame KeyTime="0" Value="1" />
        <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1" />
        <EasingDoubleKeyFrame KeyTime="0:0:1.9" Value="1" />
        <EasingDoubleKeyFrame KeyTime="0:0:2.8" Value="0" />
    </DoubleAnimationUsingKeyFrames>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)"
                                   Storyboard.TargetName="myImage">
        <DiscreteObjectKeyFrame KeyTime="0">
            <DiscreteObjectKeyFrame.Value>
                <Visibility>Visible</Visibility>
            </DiscreteObjectKeyFrame.Value>
        </DiscreteObjectKeyFrame>
        <DiscreteObjectKeyFrame KeyTime="0:0:3">
            <DiscreteObjectKeyFrame.Value>
                <Visibility>Collapsed</Visibility>
            </DiscreteObjectKeyFrame.Value>
        </DiscreteObjectKeyFrame>
    </ObjectAnimationUsingKeyFrames>
</Storyboard>

希望这有帮助!

答案 1 :(得分:1)

将这行代码添加到StoryBoard已完成事件解决了问题:

MyStoryboard.Stop();