我有一个基于布尔值运行故事板的DataTrigger
<DataTrigger Binding="{Binding Path=IsValid}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
...
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
所以当IsValid = true时,我的故事板就会运行。这没关系。但这是问题所在: 当我的IsValid = true时,我想把我的故事板改为RERUN。我的IsValid看起来像这样:
private bool _isValid = false;
public bool IsValid
{
set {
_isValid = value;
OnPropertyChanged("IsValid")
}
}
我知道我的故事板必然是真的,但是没有办法重新启动这个糟糕的事情,每次我在ViewModel代码中使用IsValid = true时都会重新启动故事板吗?
答案 0 :(得分:3)
问题是您的故事板永远不会停止。您需要为BeginStoryboard
提供一个名称,然后添加ExitActions
部分:
<DataTrigger Binding="{Binding Path=IsValid}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard Name="sb">
<Storyboard>
...
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="sb" />
</DataTrigger.ExitActions>
</DataTrigger>
答案 1 :(得分:1)
我解决这个问题的方法是:
IsValid = false; // this needs to come right before i ever do an IsValid = true
IsValid = true;
然后动画自动重启,辉煌呃?
答案 2 :(得分:1)
所以我遇到了“重新启动”动画的问题。 storyboard.remove或storyboard.stop因某些原因无法正常工作。
无论如何,我搜索了一段时间,当我发现没有解决方案时,我意识到几年前我遇到了同样的问题,而我自制的解决方案如下:只需在时间0添加关键帧即可属性重置。
代码中的示例,vb .net:
Dim sb As New Storyboard
Dim dauk3 As New DoubleAnimationUsingKeyFrames
dauk3.BeginTime = New TimeSpan(0)
dauk3.SetValue(Storyboard.TargetNameProperty, target)
dauk3.SetValue(Storyboard.TargetPropertyProperty, New PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"))
'The keyframe below resets the animation at time 0
Dim sdk0 As New SplineDoubleKeyFrame()
sdk0.KeyTime = TimeSpan.FromSeconds(0)
sdk0.Value = 0
'The keyframe above resets the animation at time 0
Dim sdk As New SplineDoubleKeyFrame()
sdk.KeyTime = TimeSpan.FromSeconds(span)
sdk.Value = width
dauk3.KeyFrames.Add(sdk0)
dauk3.KeyFrames.Add(sdk)
sb.Children.Add(dauk3)
sb.Begin(Me, True)
示例,在设计中,xaml:
<Storyboard x:Key="Show GridIconDetailsRight">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="GridIconDetailsRight">
<!-- The keyframe below resets value at time 0 -->
<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
<!-- The keyframe above resets value at time 0 -->
<EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="-200"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
希望这可以帮助别人。当我想起我的解决方案时,我整天都在拉头发。