WPF Image Behavior

 public class SmoothSlidingBehavior : Behavior<Image>
    {
        //<Image.RenderTransform>
        //    <TransformGroup>
        //        <ScaleTransform/>
        //        <SkewTransform/>
        //        <RotateTransform/>
        //        <TranslateTransform/>
        //    </TransformGroup>
        //</Image.RenderTransform>
        protected override void OnAttached()
        {
            var transformGroup = (AssociatedObject.RenderTransform as TransformGroup);
            if (transformGroup == null || transformGroup.Children.Count.Equals(0))
            {
                transformGroup = new TransformGroup();
                transformGroup.Children.Add(new ScaleTransform());
                transformGroup.Children.Add(new SkewTransform());
                transformGroup.Children.Add(new RotateTransform());
                transformGroup.Children.Add(new TranslateTransform());
                AssociatedObject.RenderTransform = transformGroup;
            }
            var descriptor = DependencyPropertyDescriptor.FromProperty(Image.SourceProperty, typeof(Image));
            if (descriptor != null)
            {
                descriptor.AddValueChanged(AssociatedObject, ImageSourceChanged);
            }
            base.OnAttached();
        }

        private void ImageSourceChanged(object sender, EventArgs e)
        {
            var doubleAnimationUsingKeyFrames = new DoubleAnimationUsingKeyFrames();
            doubleAnimationUsingKeyFrames.KeyFrames.Add(new LinearDoubleKeyFrame(-105, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0))));
            doubleAnimationUsingKeyFrames.KeyFrames.Add(new LinearDoubleKeyFrame(20, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(500))));
            doubleAnimationUsingKeyFrames.KeyFrames.Add(new LinearDoubleKeyFrame(-20, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(600))));
            doubleAnimationUsingKeyFrames.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(700))));
            var storyboard = new Storyboard();
            storyboard.Children.Add(doubleAnimationUsingKeyFrames);
            Storyboard.SetTargetProperty(doubleAnimationUsingKeyFrames, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)"));
            Storyboard.SetTarget(doubleAnimationUsingKeyFrames, AssociatedObject);
            storyboard.Begin();
        }
    }

 

posted @ 2013-05-19 11:16  谷安  阅读(501)  评论(0编辑  收藏  举报