using System.Windows; using System.Windows.Media.Animation; using Microsoft.Xaml.Behaviors; namespace AntdWpf.Behaviors { /// /// Provides the ability to animate when changing the Visibility property for an element. /// public class VisibilityBehavior : Behavior { #region Fields private Visibility visibility; #endregion #region Properties public static readonly DependencyProperty AppearProperty = DependencyProperty.Register("Appear", typeof(Storyboard), typeof(VisibilityBehavior), new PropertyMetadata(null)); /// /// Gets/sets the storyboard when the element is visible. /// public Storyboard Appear { get { return (Storyboard)GetValue(AppearProperty); } set { SetValue(AppearProperty, value); } } public static readonly DependencyProperty LeaveProperty = DependencyProperty.Register("Leave", typeof(Storyboard), typeof(VisibilityBehavior), new PropertyMetadata(null)); /// /// Gets/sets the storyboard when the element is hidden. /// public Storyboard Leave { get { return (Storyboard)GetValue(LeaveProperty); } set { SetValue(LeaveProperty, value); } } #endregion #region Overrides protected override void OnAttached() { visibility = AssociatedObject.Visibility; AssociatedObject.IsVisibleChanged += OnVisibleChanged; base.OnAttached(); } private void OnLoaded(object sender, RoutedEventArgs e) { AssociatedObject.IsVisibleChanged += OnVisibleChanged; } protected override void OnDetaching() { AssociatedObject.IsVisibleChanged -= OnVisibleChanged; base.OnDetaching(); } #endregion #region Private Methods private void OnVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { if (visibility == AssociatedObject.Visibility) return; Storyboard storyboard; if (AssociatedObject.Visibility == Visibility.Visible) { if (Appear == null) return; storyboard = Appear; visibility = AssociatedObject.Visibility; } else { if (Leave == null) return; var cache = AssociatedObject.Visibility; AssociatedObject.SetCurrentValue(UIElement.VisibilityProperty, visibility = Visibility.Visible); storyboard = Leave.Clone(); storyboard.Completed += (s, a) => AssociatedObject.SetCurrentValue(UIElement.VisibilityProperty, visibility = cache); } AssociatedObject.BeginStoryboard(storyboard); } #endregion } }