2011-03-08 56 views
2

我有一个运行基于一个布尔值WPF:使用datatriggers /布尔值重新启动故事板?

<DataTrigger Binding="{Binding Path=IsValid}" Value="True"> 
    <DataTrigger.EnterActions> 
     <BeginStoryboard> 
       <Storyboard> 
       ...         
       </Storyboard> 
     </BeginStoryboard> 
    </DataTrigger.EnterActions> 
</DataTrigger> 

所以,当IsValid的= true,则我的故事板运行Storyboard的DataTrigger。这工作正常。但问题在于: 当我的IsValid = true时,我想让故事板显示为RERUN。我的IsValid看起来是这样的:

private bool _isValid = false; 
public bool IsValid 
{ 
     set { 
     _isValid = value; 
     OnPropertyChanged("IsValid") 
     } 
} 

我知道我的故事板被绑定到它是真实的,而不是有没有办法重新启动混账东西,并有故事板重启,每次我进去的IsValid =真我ViewModel代码?

回答

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> 
+0

不知道关于StopStoryBoard,解决了我的DataTrigger问题。谢谢! – strattonn 2011-06-28 21:09:05

1

我解决这个问题的方法是这样做的:

IsValid = false; // this needs to come right before i ever do an IsValid = true 
IsValid = true; 

那么动画重新启动自动神奇,辉煌吧?

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> 

希望这有助于人们摆脱。当我想起我的解决方案时,整天都在拉我的头发。