【问题标题】:Animate property and see when it changes in code behind动画属性并查看它何时在后面的代码中更改
【发布时间】:2012-06-01 12:03:55
【问题描述】:

我经常需要为一些不属于 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
  );

【问题讨论】:

    标签: c# wpf storyboard dependency-properties


    【解决方案1】:

    如果您想为属性设置动画并在动画运行时收到有关值更改的通知,您必须将该属性设置为依赖属性,并通过依赖属性元数据附加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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多