繁体   English   中英

在WPF中停止和启动动画

[英]Stop and start animation in WPF

我无法启动和停止动画,后面的代码(c#)我尝试了MyStoryboard.stop()并更改了动画的持续时间,但动画停止了,但仅当我更改内容并返回时才停止。 当我再次启动它时,我的动画以奇怪的速度运行,并且仅当我更改内容时才运行

当我更改内容时,会有一个新的速度,如果我继续这样做,它就会出错

XAML:

<Image Grid.Row="0" MaxHeight="50" Source="..\Images\Propeller.png" 
   RenderTransformOrigin=".5,.5">
    <Image.RenderTransform>
         <RotateTransform x:Name="MyAnimation" Angle="0" />
    </Image.RenderTransform>
    <Image.Triggers>
        <EventTrigger RoutedEvent="Loaded">
             <BeginStoryboard>
                  <Storyboard x:Name="MyStoryboard">
                          <DoubleAnimation x:Name="Prope11" 
                            Storyboard.TargetName="MyAnimation"                     
                                 To="360" 
                                 Duration="0:0:0.6"
                                 RepeatBehavior="Forever"
                                 FillBehavior="Stop" />
                    </Storyboard>
              </BeginStoryboard>
         </EventTrigger>
     </Image.Triggers>
 </Image>

后面的代码:

  TimeSpan ts = TimeSpan.FromMilliseconds(600);
  MyStoryboard.Stop();
  Prope11.Duration = ts;
  MyStoryboard.Bigin();

您尚未分配情节提要的TargetName属性来启动动画。

好了,您的xaml中有两个问题使动画开始。

1) Storyboard.TargetName =“ MyAnimation”,目标名称必须是控件名称。 在您的情况下,您提供了但已将其指定给或分配给RotateTransform,该控件位于Image控件下,但不包含在image之下。

 <Image    x:Name="ImageControl" Grid.Row="0" MaxHeight="50" Source="C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"
   RenderTransformOrigin=".5,.5"   >

并在DoubleAnimation中提供TargetName作为图像控件的名称

Storyboard.TargetName="ImageControl" 

2)另一个问题是您尚未提供双重动画所依赖的目标属性。

Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" 

您的停止代码不起作用,因为它没有启动。 将其添加到xaml以下将解决您的问题。

速度变化是因为您给了600,所以6秒必须为6000,而不是600。

这是我所做的更改。 在“按下鼠标”事件中​​,我已停止了StoryBoard。

     <Image.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard x:Name="BeginImageRotateAni" >
                <Storyboard x:Name="MyStoryboard">
                    <DoubleAnimation x:Name="Prope11" 
                    Storyboard.TargetName="ImageControl"         
                      Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" 
                         To="360" 
                         Duration="0:0:6"
                         RepeatBehavior="Forever"
                         FillBehavior="Stop"
                           >
                    </DoubleAnimation>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="MouseDown">
            <EventTrigger.Actions>
                <StopStoryboard BeginStoryboardName="BeginImageRotateAni"/>

            </EventTrigger.Actions>
        </EventTrigger>
    </Image.Triggers>

并在构造函数中订阅了MouseDownEvent

  ImageControl.MouseDown += ImageControl_MouseDown;

并在事件内部编写以下代码。

    bool IsAnimationstarted = true;

private void ImageControl_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (IsAnimationstarted)
    {
        MyStoryboard.Stop();
        IsAnimationstarted = false;
    }
    else
    {
        TimeSpan ts = TimeSpan.FromMilliseconds(6000);
        Prope11.Duration = ts;
        MyStoryboard.Begin();
        IsAnimationstarted = true;
    }
}
}

替代解决方案:-通过在资源中创建动画,然后在背后的代码中使用它。

<Window.Resources>
    <Storyboard x:Name="MyStoryboard" x:Key="Animation1" >
        <DoubleAnimation x:Name="Prope11" 
                        Storyboard.TargetName="ImageControl"         
                          Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" 
                             To="360" 
                             Duration="0:0:6"
                             RepeatBehavior="Forever"
                             FillBehavior="Stop"
                               >
        </DoubleAnimation>
    </Storyboard>
</Window.Resources>

在后面的代码中:

bool IsAnimationstarted = true;

private void ImageControl_MouseDown(object sender, MouseButtonEventArgs e)
{
    Storyboard board = (Storyboard)this.FindResource("Animation1");
    if (IsAnimationstarted)
    {
        IsAnimationstarted = false;
        board.Begin();
    }
    else
    {
        IsAnimationstarted = true;
        board.Pause();
    }
}

我不知道为什么要改变速度或不确定您的意图。 我在这里所做的是,当用户单击图像控件时,它将启动动画并再次暂停单击,然后继续。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM