2012-05-25 94 views
0

後面的代碼更改時,我經常必須動畫幾件不屬於wpf視圖的東西,比如我的電腦音量或鼠標位置。我希望通過使用wpf故事板並建立在緩動功能中來實現。動畫屬性,看看它在

例如,讓我們說,我想用下面的故事板動畫(降低音量)我的電腦上:

<Storyboard x:Key="Storyboard1"> 
     <DoubleAnimationUsingKeyFrames 
        Storyboard.TargetProperty="someProperty" 
        Storyboard.TargetName="SomeTarget"> 
      <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"> 
       <EasingDoubleKeyFrame.EasingFunction> 
        <CircleEase EasingMode="EaseOut"/> 
       </EasingDoubleKeyFrame.EasingFunction> 
      </EasingDoubleKeyFrame> 
     </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

,並在我的代碼後面我設置與功能的卷:

MyVolumeController.SetVolume(0); 

,結果我會想創建一個函數,將看起來像:(注意函數是某種形式的僞代碼)

public void AnimateProperty(Storyboard sb, Action<double> onPropertyChange) 
{ 
     var property = //sb.targetProperty; 

     property.OnValueChanged += (a,b)=>{ 

      onPropertyChange(b.newValue); 

     } 

     sb.begin();// start animating 

} 

然後我就能夠以動畫的音量通過調用該方法爲:

AnimateProperty(
      (Storyboard)this.FindResource("Storyboard1"), // storyboard 
      (newVal)=>{MyVolumeController.SetVolume(newVal) // action 
); 

回答

5

如果要動畫一個屬性,收到通知價值變動動畫運行時,你將不得不使該屬性成爲依賴項屬性,並通過依賴項屬性元數據附加PropertyChangedCallback

這樣一個依賴屬性的典型聲明看起來像下面的代碼(帶雙物業類型這裏):

public class MyControl : ... 
{ 
    public static readonly DependencyProperty SomethingProperty = 
     DependencyProperty.Register(
      "Something", typeof(double), typeof(MyControl), 
      new FrameworkPropertyMetadata(
       (o, e) => ((MyControl)o).SomethingChanged((double)e.NewValue))); 

    public double Something 
    { 
     get { return (double)GetValue(SomethingProperty); } 
     set { SetValue(SomethingProperty, value); } 
    } 

    private void SomethingChanged(double newValue) 
    { 
     // process value changes here 
    } 

    ... 
} 

現在您可以輕鬆地製作動畫這個屬性,或者通過一個故事板,或者更簡單通過直接應用動畫:

DoubleAnimation animation = new DoubleAnimation 
{ 
    To = ..., 
    Duration = ..., 
}; 

myControl.BeginAnimation(SomethingProperty, animation);