private static void OnIsPivotAnimatedChanged(DependencyObject d, DependencyPropertyChangedEventArgs args) { ItemsControl list = d as ItemsControl; list.Loaded += (s2, e2) => { // locate the pivot control that this list is within Pivot pivot = list.Ancestors <Pivot>().Single() as Pivot; // and its index within the pivot int pivotIndex = pivot.Items.IndexOf(list.Ancestors <PivotItem>().Single()); bool selectionChanged = false; pivot.SelectionChanged += (s3, e3) => { selectionChanged = true; }; // handle manipulation events which occur when the user // moves between pivot items pivot.ManipulationCompleted += (s, e) => { if (!selectionChanged) { return; } selectionChanged = false; if (pivotIndex != pivot.SelectedIndex) { return; } // determine which direction this tab will be scrolling in from bool fromRight = e.TotalManipulation.Translation.X <= 0; // iterate over each of the items in view var items = list.GetItemsInView().ToList(); for (int index = 0; index < items.Count; index++) { var lbi = items[index]; list.Dispatcher.BeginInvoke(() => { var animationTargets = lbi.Descendants() .Where(p => MetroInMotion.GetAnimationLevel(p) > -1); foreach (FrameworkElement target in animationTargets) { // trigger the required animation GetSlideAnimation(target, fromRight).Begin(); } }); } ; }; }; }
/// <summary> /// Creates a TranslateTransform and associates it with the given element, returning /// a Storyboard which will animate the TranslateTransform with a SineEase function /// </summary> private static Storyboard GetSlideAnimation(FrameworkElement element, bool fromRight) { double from = fromRight ? 80 : -80; Storyboard sb; double delay = (MetroInMotion.GetAnimationLevel(element)) * 0.1 + 0.1; TranslateTransform trans = new TranslateTransform() { X = from }; element.RenderTransform = trans; sb = new Storyboard(); sb.BeginTime = TimeSpan.FromSeconds(delay); sb.Children.Add(CreateAnimation(from, 0, 0.8, "X", trans)); return(sb); }