2011-03-08 38 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> 

希望這有助於人們擺脫。當我想起我的解決方案時,整天都在拉我的頭髮。