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
  );
4

1 回答 1

5

如果您想为属性设置动画并在动画运行时收到有关值更改的通知,您必须将该属性设置为依赖属性,并通过依赖属性元数据附加一个PropertyChangedCallback 。

这种依赖属性的典型声明类似于下面的代码(此处使用 double 作为属性类型):

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
    }

    ...
}

现在,您可以通过 Storyboard 轻松地为该属性设置动画,或者通过直接应用 Animation 更简单:

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

myControl.BeginAnimation(SomethingProperty, animation);
于 2012-05-26T06:46:54.100 回答