WPF:使用datatriggers / boolean值重新启动故事板?

时间:2011-03-08 20:28:39

标签: c# wpf xaml

我有一个基于布尔值运行故事板的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时都会重新启动故事板吗?

3 个答案:

答案 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>

希望这可以帮助别人。当我想起我的解决方案时,我整天都在拉头发。