【问题标题】:WPF: Restarting storyboards with datatriggers / boolean values?WPF:使用数据触发器/布尔值重新启动情节提要?
【发布时间】:2011-07-11 09:51:27
【问题描述】:

我有一个基于布尔值运行情节提要的 DataTrigger

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

所以当 IsValid = true 时,我的故事板就会运行。这工作正常。但问题是: 当我的 IsValid = true 时,我希望我的故事板重新运行。我的 IsValid 看起来像这样:

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

我知道我的故事板必然是真实的,但有没有办法重新启动该死的事情并在每次我在 ViewModel 代码中使用 IsValid = true 时重新启动故事板?

【问题讨论】:

    标签: c# wpf xaml


    【解决方案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>
    

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

    【讨论】:

      【解决方案2】:

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

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

      然后动画会自动神奇地重新开始,很棒吧?

      【讨论】:

        【解决方案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>
        

        【讨论】:

        • 不知道 StopStoryBoard,解决了我的 DataTrigger 问题。谢谢!
        猜你喜欢
        • 2020-01-01
        • 1970-01-01
        • 2014-03-12
        • 2012-04-27
        • 2023-03-21
        • 2021-03-25
        • 2020-08-06
        • 2012-11-22
        • 2012-07-08
        相关资源
        最近更新 更多