2014-03-05 57 views
4

我有一個故事板,我想多次運行。不幸的是,它在第​​一次運行後,即使這個代碼被擊中,它也不會再次生成動畫。它只是第一次動畫。我正在設置一個初始值....即使在我再次運行之前設置該值。爲什麼我的Storyboard只運行一次?

DoubleAnimationUsingKeyFrames animateTransformX = new DoubleAnimationUsingKeyFrames(); 

EasingDoubleKeyFrame initialTransformXKeyframe = new EasingDoubleKeyFrame(); 
initialTransformXKeyframe.KeyTime = TimeSpan.FromSeconds(0); 
//Resetting the value before running it again. 
initialTransformXKeyframe.Value = 0; 
animateTransformX.KeyFrames.Add(initialTransformXKeyframe); 


EasingDoubleKeyFrame animateTransformXKeyframe = new EasingDoubleKeyFrame(); 
animateTransformXKeyframe.KeyTime = TimeSpan.FromSeconds(0.5); 
animateTransformXKeyframe.Value = aDynamicValueGoesHere; 
animateTransformX.KeyFrames.Add(animateTransformXKeyframe); 


Storyboard.SetTarget(animateTransformX, image); 
Storyboard.SetTargetProperty(animateTransformX, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.X)")); 

Storyboard myStoryboard = new Storyboard(); 
myStoryboard.Children.Add(animateTransformX); 

myStoryboard.Begin(this); 

我覺得這很簡單,但對於我的生活我無法理解爲什麼。任何幫助,將不勝感激。

編輯

我從代碼隱藏這樣做的原因是因爲故事板是凍結的,我曾在與他們的動態值在過去的麻煩。爲了簡單起見,我沒有把我在代碼中使用動態值;我更新了上面的代碼以顯示我正在使用動態值。

我嘗試將故事板添加爲使用動態值的資源內的XAML。如果使用非動態值,但它只能播放一次(第一次)使用動態值時可以正常播放(並重播)。例如,如果{Binding OffsetX}被替換爲50,例如,這可以很好地並且重複地工作。 OffsetX通過實施INotifyPropertyChanged的屬性得到更新。即使它是相同的,如果它從未更新過,我認爲它應該仍然具有的動畫效果,只是它與之前的動畫效果相同(就像它的50一樣)。但情況並非如此;它只是不再生動畫。所以現在我真的迷路了。

<Storyboard x:Key="InitialAnimate"> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.X)" Storyboard.TargetName="StoryImage"> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="{Binding OffsetX}"/> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

EDIT 2

我不解決這個問題,但我發現,我的特定情況下工作的解決方法。我得到這個錯誤在我的輸出窗口:

System.Windows.Media.Animation Warning: 6 : Unable to perform action because the specified Storyboard was never applied to this object for interactive control.; Action='Stop'; Storyboard='System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode='28715394'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; TargetElement='System.Windows.Controls.Grid'; TargetElement.HashCode='6255521'; TargetElement.Type='System.Windows.Controls.Grid' 

我發現關於它,including how to find what Storyboard caused the issueanother unanswered question幾個StackOverflow的答案。

我仍然不確定如何解決我最初的問題,但這是我的解決方法。由於我只需要重新啓動時運行的動畫(發生在我的viewmodel中的事件),因此我使用viewmodel中引發的事件並在父視圖中消耗,以刪除並重新添加包含動畫的UserControl

在這UserControl,我觸發通過ControlStoryboardAction綁在LoadedEventTrigger故事板。這會使動畫在加載時運行,並且它在UserControl的生命週期中只運行一次動畫。我可以在XAML中使用動態值。下面是我如何刪除和readding認爲從它的父:

父視圖:

<grid x:Name="imageHolder></grid> 

父代碼隱藏:

private void CreateAnimations(object sender, EventArgs e) 
{ 
    imageHolder.Children.RemoveAt(0); 
    Views.Image image = new Image(); 
    image.Name = "image"; 
    imageHolder.Children.Add(image); 
} 
+2

+1您的代碼看起來是否正確...如果您在XAML中創建動畫,它會正常工作嗎? – BradleyDotNET

+0

我會試試看看會發生什麼。 – jporcenaluk

+0

這可以在XAML中正常工作,但我使用的是動態屬性,它位於ItemsControl中。我會編輯我的問題以提供更多信息。 – jporcenaluk

回答

0

您不能Value屬性更改在運行時的方式你正在編輯之後。

這是因爲動畫是可凍結的對象。 MSDN文檔中有更多 信息,但基本上這意味着您的 無法使用綁定,因爲凍結對象中的屬性(即動畫 )不能更改。

要避開此限制,您需要在代碼隱藏工作中完成部分或全部 工作。

Why Storyboard value wouldn't get from a resource or binding?

那麼你可能想回去的代碼隱藏方法。

所以,作爲一個最終的答案,我會做的是,當我想再次運行:

  • 刪除以前的故事板
  • 創造出一個全新的故事板(或者只是動畫)並運行它。
  • +0

    我的目標是每隔一段時間重複一次,而不是永遠持續。我試圖在創建故事板後,在完成後停止它,然後在沒有這種運氣的情況下重新開始故事板。 – jporcenaluk

    +0

    哦,在這種情況下......如果你是通過代碼來完成的,只需做原始動畫並跳過故事板。他們更容易管理。 –

    +0

    這是一個好主意。我找到了一種解決方法,但我會嘗試一下,幫助未來的代碼探索者。 – jporcenaluk

    相關問題