我有一個故事板,我想多次運行。不幸的是,它在第一次運行後,即使這個代碼被擊中,它也不會再次生成動畫。它只是第一次動畫。我正在設置一個初始值....即使在我再次運行之前設置該值。爲什麼我的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 issue和another unanswered question幾個StackOverflow的答案。
我仍然不確定如何解決我最初的問題,但這是我的解決方法。由於我只需要重新啓動時運行的動畫(發生在我的viewmodel中的事件),因此我使用viewmodel中引發的事件並在父視圖中消耗,以刪除並重新添加包含動畫的UserControl
。
在這UserControl
,我觸發通過ControlStoryboardAction
綁在Loaded
EventTrigger
故事板。這會使動畫在加載時運行,並且它在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);
}
+1您的代碼看起來是否正確...如果您在XAML中創建動畫,它會正常工作嗎? – BradleyDotNET
我會試試看看會發生什麼。 – jporcenaluk
這可以在XAML中正常工作,但我使用的是動態屬性,它位於ItemsControl中。我會編輯我的問題以提供更多信息。 – jporcenaluk