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