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
    }

    ...
}

ストーリーボードを使用するか、アニメーションを直接適用することで、このプロパティを簡単にアニメーション化できるようになりました。

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

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