2013-09-25 47 views
4

這可能與動畫有關。我有一個WPF控件,它的寬度和高度通過幾個不同的故事板進行動畫處理。我創建了故事板,然後在它們上面調用Begin()。我已經提供了關於下面的故事板的代碼。無法以編程方式設置WPF中動畫控件的寬度或高度(甚至不通過Snoop)

我想在某些事件(例如窗口大小調整)上重新評估控件大小,以便它與動畫的值不同。我嘗試通過設置我的控件的WidthHeight屬性手動(在動畫運行後)在SizeChanged上處理此問題。調試器顯示這些值未設置(原始值保留)。

當我通過Snoop檢查WPF時,寬度和高度行以桃紅色/橙色突出顯示,並試圖通過它重新設置值不會保留它(原始值顯示,當我集中注意力。估計是我的動畫以某種方式重寫對財產進行手動更改,但我不知道這是真的還是如何解決這個問題。

故事板類

public class MyAnimationClass 
{ 
    private Storyboard _myStoryboard; 
    private DoubleAnimation _animation1; 
    private DoubleAnimation _animation2; 
    private DoubleAnimation _animation3; 

    private void InitializeStoryboard() 
    { 
     _myStoryboard = CreateMyStoryboard(out _animation1, out _animation2, out _animation3); 
    } 

    private Storyboard CreateMyStoryboard(out DoubleAnimation animation1, out DoubleAnimation animation2, out DoubleAnimation animation3) 
    { 
     var myStoryboard = new Storyboard(); 

     // create animations 
     animation1 = new DoubleAnimation { Duration = new TimeSpan(0, 0, 0, 0, 250), From = 0, To = 0 }; 
     animation2 = new DoubleAnimation { BeginTime = new TimeSpan(), Duration = new TimeSpan(0, 0, 0, 0, 250), From = 35, To = 35 }; 
     animation3 = new DoubleAnimation { BeginTime = new TimeSpan(0, 0, 0, 0, 250), Duration = new TimeSpan(0, 0, 0, 0, 250), From = 35, To = 0 }; 

     Storyboard.SetTargetProperty(animation1, new PropertyPath(FrameworkElement.WidthProperty)); 
     Storyboard.SetTargetProperty(animation2, new PropertyPath(FrameworkElement.HeightProperty)); 
     Storyboard.SetTargetProperty(animation3, new PropertyPath(FrameworkElement.HeightProperty)); 

     myStoryboard.Children.Add(animation1); 
     myStoryboard.Children.Add(animation2); 
     myStoryboard.Children.Add(animation3); 

     return myStoryboard; 
    } 

    public void Animate(Control controlToAnimate) 
    { 
     // .... 

     var finalWidth = CalculateFinalWidth(); 
     var finalHeight = CalculateFinalHeight(); 

     _animation1.To = finalWidth; 
     _animation3.To = finalHeight; 
     _myStoryboard.Begin(controlToAnimate); 
    } 
} 

當我想動畫的東西,我在我的實例上致電Animate() 210級。

想法?

+1

對我而言,您需要先停止這些故事板。 –

+2

@HighCore我認爲它會自動停止。我剛剛發現了這篇MSDN文章,它告訴我需要將FillBehavior設置爲Stop,以便在完成時停止:http://msdn.microsoft.com/en-us/library/aa970493.aspx – sohum

+1

嗯,如果我設置FillBehavior停止並調整窗口大小(觸發設置控件的寬度和高度,調用UpdateLayout並在控件上調用InvalidateVisual),動畫不再再動畫到所需的寬度和高度 - 而是通過調整大小設置動畫。我是否需要爲每個動畫創建一個新的故事板? – sohum

回答

2

這最終是一個非常簡單的修復。價值沒有變化,因爲FillBehavior控制財產價值。然而,簡單地將它改爲FillBehavior.Stop並沒有解決我的問題,因爲當我的非動畫代碼設置寬度/高度時,下一次我的動畫運行時,它會根據我想要的寬度/高度生成動畫,然後默認回到設置高度。這是通過在計算之後和動畫之前設置控件的寬度/高度來解決的:

public void Animate(Control controlToAnimate) 
{ 
    // .... 

    var finalWidth = CalculateFinalWidth(); 
    var finalHeight = CalculateFinalHeight(); 

    // set values here so after animation they stay 
    controlToAnimate.Width = finalWidth; 
    controlToAnimate.Height = finalHeight; 

    _animation1.To = finalWidth; 
    _animation3.To = finalHeight; 
    _myStoryboard.Begin(controlToAnimate); 
} 
相關問題