using Microsoft.Expression.Media.Effects; using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Animation; namespace MediaBrowser.UI.Controls { /// /// Class TransitionFrame /// public class TransitionFrame : Frame { /// /// The _content presenter /// private ContentPresenter _contentPresenter = null; #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(TransitionFrame), 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(TransitionFrame), new UIPropertyMetadata(null)); #endregion DP Transition Animation /// /// Called when the template generation for the visual tree is created. /// public override void OnApplyTemplate() { // get a reference to the frame's content presenter // this is the element we will fade in and out _contentPresenter = GetTemplateChild("PART_FrameCP") as ContentPresenter; base.OnApplyTemplate(); } /// /// Animates the content. /// /// The navigation action. /// if set to true [check content]. /// if set to true [is back]. private void AnimateContent(Action navigationAction, bool checkContent = true, bool isBack = false) { if (TransitionType == null || (checkContent && Content == null)) { CommandBindings.Clear(); navigationAction(); CommandBindings.Clear(); return; } var oldContentVisual = this as FrameworkElement; _contentPresenter.IsHitTestVisible = false; var da = TransitionAnimation.Clone(); da.From = 0; da.To = 1; da.FillBehavior = FillBehavior.HoldEnd; var transitionEffect = TransitionType.Clone() as TransitionEffect; if (isBack) { ReverseDirection(transitionEffect); } transitionEffect.OldImage = new VisualBrush(oldContentVisual); transitionEffect.BeginAnimation(TransitionEffect.ProgressProperty, da); _contentPresenter.Effect = transitionEffect; _contentPresenter.IsHitTestVisible = true; // Remove base class bindings to remote buttons CommandBindings.Clear(); navigationAction(); CommandBindings.Clear(); } /// /// Navigates the with transition. /// /// The page. public void NavigateWithTransition(Page page) { AnimateContent(() => Navigate(page)); } /// /// Navigates the with transition. /// /// The page. public void NavigateWithTransition(Uri page) { AnimateContent(() => Navigate(page)); } /// /// Goes the back with transition. /// public void GoBackWithTransition() { if (CanGoBack) { AnimateContent(GoBack, false, true); } } /// /// Goes the forward with transition. /// public void GoForwardWithTransition() { if (CanGoForward) { AnimateContent(GoForward, false); } } /// /// Reverses the direction. /// /// The transition effect. private void ReverseDirection(TransitionEffect transitionEffect) { var circleRevealTransitionEffect = transitionEffect as CircleRevealTransitionEffect; if (circleRevealTransitionEffect != null) { circleRevealTransitionEffect.Reverse = true; return; } var slideInTransitionEffect = transitionEffect as SlideInTransitionEffect; if (slideInTransitionEffect != null) { if (slideInTransitionEffect.SlideDirection == SlideDirection.RightToLeft) { slideInTransitionEffect.SlideDirection = SlideDirection.LeftToRight; } return; } var wipeTransitionEffect = transitionEffect as WipeTransitionEffect; if (wipeTransitionEffect != null) { if (wipeTransitionEffect.WipeDirection == WipeDirection.RightToLeft) { wipeTransitionEffect.WipeDirection = WipeDirection.LeftToRight; } } } } }