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(); } }