aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.UI.Controls/TransitionControl.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.UI.Controls/TransitionControl.cs')
-rw-r--r--MediaBrowser.UI.Controls/TransitionControl.cs147
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