[英]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.