2010-08-19 97 views
0

我對大量的WPF還不是非常熟悉,所以如果這個查詢背叛了一些明顯的誤解,我會很感激他們被指出的。是否可以在不重新啓動整個動畫的情況下更新DoubleAnimation.FromProperty?

我試圖做的(無論好壞)是使DoubleAnimation.FromProperty與包含/運行動畫的StackPanel的實際寬度同步。

我最初試圖用數據綁定來做這件事,

BindingOperations.SetBinding(anim, 
    DoubleAnimation.FromProperty, 
    new Binding {Source = panel, Path = new PropertyPath(ActualWidthProperty)});

但這似乎並不奏效。儘管我可以將文本框綁定到From屬性並查看它正在更改,但動畫仍會從初始值繼續運行。這與故事板凍結有關嗎? (我一無所知,但剛剛聽說)

然後我想,爲什麼不停止並重新啓動故事板(將其關閉並再次打開!),同時更改FromProperty,處理StackPanel.SizeChanged事件。類似這樣的:

void panel_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    if (myStoryBoard != null && myStoryBoard.GetCurrentState(panel) == ClockState.Active) 
    { 
     myStoryBoard.Stop(panel); 
     foreach(var child in myStoryBoard.Children) 
     { 
      var anim = child as DoubleAnimation; 
      if (anim == null) continue; 
      anim.From = panel.ActualWidth; 
     } 
     myStoryBoard.Begin(panel, true); 
    } 
} 

這是有效的,但是,當然,它每次調整面板大小時都會從頭開始動畫。我更喜歡的是能夠從被中斷的位置恢復動畫,但使用新的FromProperty。這甚至有可能嗎?

回答

1

這比您想象的要容易得多。關於WPF和Silverlight中動畫的很酷的一點是它們可以相對於當前的情況。創建相對動畫需要做的唯一一件事情就是創建例如帶有To的DoubleAnimation填充,但不要填寫From。下面

實施例是從當前值一個StackPanel的不透明度動畫至1:

<DoubleAnimation Duration="0:0: To="1" 
    Storyboard.TargetName="LayoutRoot" 
    Storyboard.TargetProperty="StackPanel.Opacity" /> 

EDIT1:
使動畫循環返回到其原始值,而無需使用從和循環永遠

<Storyboard AutoReverse="True" RepeatBehavior="Forever"> 
    <DoubleAnimation Duration="0:0:2" 
         To="1" 
         Storyboard.TargetName="LayoutRoot" 
         Storyboard.TargetProperty="StackPanel.Opacity" 
         /> 
</Storyboard> 
+0

我不認爲這真的解決了這個問題。我需要設置From,因爲我想讓動畫循環。在這種情況下,它應該從面板的右邊緣循環到左邊的視野外。 – adhocgeek 2010-08-19 11:32:26

+0

我編輯了我的答案,並認爲這會做到這一點。 – 2010-08-19 14:10:43

相關問題