You can simply write an attached property:
static class ContentControlExtensions { public static readonly DependencyProperty ContentChangedAnimationProperty = DependencyProperty.RegisterAttached( "ContentChangedAnimation", typeof(Storyboard), typeof(ContentControlExtensions), new PropertyMetadata(default(Storyboard), ContentChangedAnimationPropertyChangedCallback)); public static void SetContentChangedAnimation(DependencyObject element, Storyboard value) { element.SetValue(ContentChangedAnimationProperty, value); } public static Storyboard GetContentChangedAnimation(DependencyObject element) { return (Storyboard)element.GetValue(ContentChangedAnimationProperty); } private static void ContentChangedAnimationPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) { var contentControl = dependencyObject as ContentControl; if (contentControl == null) throw new Exception("Can only be applied to a ContentControl"); var propertyDescriptor = DependencyPropertyDescriptor.FromProperty(ContentControl.ContentProperty, typeof (ContentControl)); propertyDescriptor.RemoveValueChanged(contentControl, ContentChangedHandler); propertyDescriptor.AddValueChanged(contentControl, ContentChangedHandler); } private static void ContentChangedHandler(object sender, EventArgs eventArgs) { var animateObject = (FrameworkElement) sender; var storyboard = GetContentChangedAnimation(animateObject); storyboard.Begin(animateObject); } }
and then in XAML:
<ContentControl Content="{Binding SelectedViewItem}"> <extensions:ContentControlExtensions.ContentChangedAnimation> <Storyboard> <ThicknessAnimation To="0" From="30,0,-30,0" Duration="0:0:0.3" Storyboard.TargetProperty="Margin"/> </Storyboard> </extensions:ContentControlExtensions.ContentChangedAnimation> </ContentControl>
It is much simpler and shorter than the new control.
source share