using Microsoft.Expression.Media.Effects; using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Animation; namespace MediaBrowser.UI.Controls { /// /// http://victorcher.blogspot.com/2012/02/wpf-transactions.html /// public class TransitionControl : ContentControl { /// /// The _content presenter /// private ContentPresenter _contentPresenter; /// /// Initializes static members of the class. /// static TransitionControl() { DefaultStyleKeyProperty.OverrideMetadata( typeof(TransitionControl), new FrameworkPropertyMetadata(typeof(TransitionControl))); ContentProperty.OverrideMetadata( typeof(TransitionControl), new FrameworkPropertyMetadata(OnContentPropertyChanged)); } /// /// When overridden in a derived class, is invoked whenever application code or internal processes call . /// public override void OnApplyTemplate() { base.OnApplyTemplate(); _contentPresenter = (ContentPresenter)Template.FindName("ContentPresenter", this); } #region DP TransitionType /// /// Gets or sets the type of the transition. /// /// The type of the transition. public TransitionEffect TransitionType { get { return (TransitionEffect)GetValue(TransitionTypeProperty); } set { SetValue(TransitionTypeProperty, value); } } // Using a DependencyProperty as the backing store for TransitionType. This enables animation, styling, binding, etc... /// /// The transition type property /// public static readonly DependencyProperty TransitionTypeProperty = DependencyProperty.Register("TransitionType", typeof(TransitionEffect), typeof(TransitionControl), new UIPropertyMetadata(new BlindsTransitionEffect())); #endregion DP TransitionType #region DP Transition Animation /// /// Gets or sets the transition animation. /// /// The transition animation. public DoubleAnimation TransitionAnimation { get { return (DoubleAnimation)GetValue(TransitionAnimationProperty); } set { SetValue(TransitionAnimationProperty, value); } } // Using a DependencyProperty as the backing store for TransitionAnimation. This enables animation, styling, binding, etc... /// /// The transition animation property /// public static readonly DependencyProperty TransitionAnimationProperty = DependencyProperty.Register("TransitionAnimation", typeof(DoubleAnimation), typeof(TransitionControl), new UIPropertyMetadata(null)); #endregion DP Transition Animation /// /// Called when [content property changed]. /// /// The dp. /// The instance containing the event data. private static void OnContentPropertyChanged(DependencyObject dp, DependencyPropertyChangedEventArgs args) { var oldContent = args.OldValue; var newContent = args.NewValue; var transitionControl = (TransitionControl)dp; if (DesignerProperties.GetIsInDesignMode(transitionControl)) return; if (oldContent != null && newContent != null && transitionControl.IsVisible) { transitionControl.AnimateContent(oldContent, newContent); } else if (newContent != null) { transitionControl.Content = newContent; } } /// /// Animates the content. /// /// The old content. /// The new content. private void AnimateContent(object oldContent, object newContent) { FrameworkElement oldContentVisual; try { oldContentVisual = VisualTreeHelper.GetChild(_contentPresenter, 0) as FrameworkElement; } catch { return; } var transitionEffect = TransitionType; if (transitionEffect == null) { _contentPresenter.Content = newContent; return; } var da = TransitionAnimation; da.From = 0; da.To = 1; da.FillBehavior = FillBehavior.HoldEnd; transitionEffect.OldImage = new VisualBrush(oldContentVisual); transitionEffect.BeginAnimation(TransitionEffect.ProgressProperty, da); _contentPresenter.Effect = transitionEffect; _contentPresenter.Content = newContent; } } }