private void Frame_Navigated(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e) { var navigatedPage = (sender as Frame).Content as Page; if (navigatedPage == null) { return; } void loadedHandler(object s, RoutedEventArgs args) { var page = s as Page; page.Loaded -= loadedHandler; object parameter; if (_nextParameter != null) { parameter = _nextParameter; } else if (e.NavigationMode == Windows.UI.Xaml.Navigation.NavigationMode.Back) { var sourcePage = (sender as Frame).ForwardStack.LastOrDefault(); parameter = sourcePage?.Parameter; } else { parameter = e.Parameter; } var cas = ConnectedAnimationService.GetForCurrentView(); var connectedAnimationsProps = Connected.GetPageConnectedAnimationProperties(page); var coordinatedAnimationElements = Connected.GetPageCoordinatedAnimationElements(page); foreach (var props in connectedAnimationsProps.Values) { var connectedAnimation = cas.GetAnimation(props.Key); var animationHandled = false; if (connectedAnimation != null) { if (props.IsListAnimation && parameter != null && ApiInformationHelper.IsCreatorsUpdateOrAbove) { foreach (var listAnimProperty in props.ListAnimProperties) { if (listAnimProperty.ListViewBase.ItemsSource is IEnumerable <object> items && items.Contains(parameter)) { listAnimProperty.ListViewBase.ScrollIntoView(parameter); // give time to the UI thread to scroll the list var t = listAnimProperty.ListViewBase.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => { try { var success = await listAnimProperty.ListViewBase.TryStartConnectedAnimationAsync(connectedAnimation, parameter, listAnimProperty.ElementName); } catch (Exception) { connectedAnimation.Cancel(); } }); animationHandled = true; } } } else if (!props.IsListAnimation) { if (ApiInformationHelper.IsCreatorsUpdateOrAbove && coordinatedAnimationElements.TryGetValue(props.Element, out var coordinatedElements)) { connectedAnimation.TryStart(props.Element, coordinatedElements); } else { connectedAnimation.TryStart(props.Element); } animationHandled = true; } } if (_previousPageConnectedAnimationProps.ContainsKey(props.Key) && animationHandled) { _previousPageConnectedAnimationProps.Remove(props.Key); } } // if there are animations that were prepared on previous page but no elements on this page have the same key - cancel foreach (var previousProps in _previousPageConnectedAnimationProps) { var connectedAnimation = cas.GetAnimation(previousProps.Key); connectedAnimation?.Cancel(); } _previousPageConnectedAnimationProps.Clear(); _nextParameter = null; } navigatedPage.Loaded += loadedHandler; }