diff options
Diffstat (limited to 'MediaBrowser.UI.Controls/TransitionControl.cs')
| -rw-r--r-- | MediaBrowser.UI.Controls/TransitionControl.cs | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/MediaBrowser.UI.Controls/TransitionControl.cs b/MediaBrowser.UI.Controls/TransitionControl.cs new file mode 100644 index 000000000..d1e5ccf0a --- /dev/null +++ b/MediaBrowser.UI.Controls/TransitionControl.cs @@ -0,0 +1,147 @@ +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 +{ + /// <summary> + /// http://victorcher.blogspot.com/2012/02/wpf-transactions.html + /// </summary> + public class TransitionControl : ContentControl + { + /// <summary> + /// The _content presenter + /// </summary> + private ContentPresenter _contentPresenter; + + /// <summary> + /// Initializes static members of the <see cref="TransitionControl" /> class. + /// </summary> + static TransitionControl() + { + DefaultStyleKeyProperty.OverrideMetadata( + typeof(TransitionControl), new FrameworkPropertyMetadata(typeof(TransitionControl))); + + ContentProperty.OverrideMetadata( + typeof(TransitionControl), new FrameworkPropertyMetadata(OnContentPropertyChanged)); + } + + /// <summary> + /// When overridden in a derived class, is invoked whenever application code or internal processes call <see cref="M:System.Windows.FrameworkElement.ApplyTemplate" />. + /// </summary> + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + _contentPresenter = (ContentPresenter)Template.FindName("ContentPresenter", this); + } + + #region DP TransitionType + + /// <summary> + /// Gets or sets the type of the transition. + /// </summary> + /// <value>The type of the transition.</value> + 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... + /// <summary> + /// The transition type property + /// </summary> + public static readonly DependencyProperty TransitionTypeProperty = + DependencyProperty.Register("TransitionType", typeof(TransitionEffect), typeof(TransitionControl), + new UIPropertyMetadata(new BlindsTransitionEffect())); + + #endregion DP TransitionType + + #region DP Transition Animation + + /// <summary> + /// Gets or sets the transition animation. + /// </summary> + /// <value>The transition animation.</value> + 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... + /// <summary> + /// The transition animation property + /// </summary> + public static readonly DependencyProperty TransitionAnimationProperty = + DependencyProperty.Register("TransitionAnimation", typeof(DoubleAnimation), typeof(TransitionControl), new UIPropertyMetadata(null)); + + #endregion DP Transition Animation + + /// <summary> + /// Called when [content property changed]. + /// </summary> + /// <param name="dp">The dp.</param> + /// <param name="args">The <see cref="DependencyPropertyChangedEventArgs" /> instance containing the event data.</param> + 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; + } + } + + /// <summary> + /// Animates the content. + /// </summary> + /// <param name="oldContent">The old content.</param> + /// <param name="newContent">The new content.</param> + 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; + } + } +}
\ No newline at end of file |
