private void OnActivityListLoaded(object sender, RoutedEventArgs e) { _scrollViewer = ActivityList.GetVisualDescendents <ScrollViewer>().FirstOrDefault(); if (_scrollViewer != null) { _scrollViewer.ViewChanged += OnScrollViewerViewChanged; _scrollViewer.ViewChanging += OnScrollViewerViewChanging; _scrollViewer.IsScrollInertiaEnabled = true; } }
private void OnActivityListLoaded(object sender, RoutedEventArgs e) { _scrollViewer = ActivityList.GetVisualDescendents <ScrollViewer>().FirstOrDefault(); if (_scrollViewer != null) { _scrollViewer.ViewChanged += OnScrollViewerViewChanged; _scrollViewer.ViewChanging += OnScrollViewerViewChanging; _scrollViewer.IsScrollInertiaEnabled = true; _scrollViewer.DirectManipulationStarted += OnDirectManipStarted; _scrollViewer.DirectManipulationCompleted += OnDirectManipCompleted; #region PullToRefresh Animation Setup // Retrieve the ScrollViewer manipulation and the Compositor. _scrollerViewerManipulation = ElementCompositionPreview.GetScrollViewerManipulationPropertySet(_scrollViewer); //Compositor = _scrollerViewerManipulation.Compositor; // Create a rotation expression animation based on the overpan distance of the ScrollViewer. _rotationAnimation = Compositor.CreateExpressionAnimation(); _rotationAnimation.SetScalarParameter("MyMultiplier", 10.0f); _rotationAnimation.SetScalarParameter("MyMaxDegree", 400.0f); _rotationAnimation.SetReferenceParameter("MyScrollManipulation", _scrollerViewerManipulation); _rotationAnimation.Expression = "min(max(0, MyScrollManipulation.Translation.Y) * MyMultiplier, MyMaxDegree)"; // Create an opacity expression animation based on the overpan distance of the ScrollViewer. _opacityAnimation = Compositor.CreateExpressionAnimation(); _opacityAnimation.SetScalarParameter("MyDivider", 30.0f); _opacityAnimation.SetReferenceParameter("MyScrollManipulation", _scrollerViewerManipulation); _opacityAnimation.Expression = "min(max(0, MyScrollManipulation.Translation.Y) / MyDivider, 1)"; // Create an offset expression animation based on the overpan distance of the ScrollViewer. _offsetAnimation = Compositor.CreateExpressionAnimation(); _offsetAnimation.SetScalarParameter("MyDivider", 30.0f); _offsetAnimation.SetScalarParameter("MyMaxOffsetY", REFRESH_ICON_MAX_OFFSET_Y); _offsetAnimation.SetReferenceParameter("MyScrollManipulation", _scrollerViewerManipulation); _offsetAnimation.Expression = "(min(max(0, MyScrollManipulation.Translation.Y) / MyDivider, 1)) * MyMaxOffsetY"; // Create a keyframe animation to reset properties like Offset.Y, Opacity, etc. _resetAnimation = Compositor.CreateScalarKeyFrameAnimation(); _resetAnimation.InsertKeyFrame(1.0f, 0.0f); // Create a loading keyframe animation (in this case, a rotation animation). _loadingAnimation = Compositor.CreateScalarKeyFrameAnimation(); _loadingAnimation.InsertKeyFrame(1.0f, 360); _loadingAnimation.Duration = TimeSpan.FromMilliseconds(800); _loadingAnimation.IterationBehavior = AnimationIterationBehavior.Forever; // Get the RefreshIcon's Visual. _refreshIconVisual = ElementCompositionPreview.GetElementVisual(RefreshIcon); // Set the center point for the rotation animation. _refreshIconVisual.CenterPoint = new Vector3(Convert.ToSingle(RefreshIcon.ActualWidth / 2), Convert.ToSingle(RefreshIcon.ActualHeight / 2), 0); // Get the ListView's inner Border's Visual. var border = (Border)VisualTreeHelper.GetChild(ActivityList, 0); _borderVisual = ElementCompositionPreview.GetElementVisual(border); _refreshIconVisual.StartAnimation(nameof(_refreshIconVisual.RotationAngleInDegrees), _rotationAnimation); _refreshIconVisual.StartAnimation(nameof(_refreshIconVisual.Opacity), _opacityAnimation); _refreshIconVisual.StartAnimation($"{nameof(_refreshIconVisual.Offset)}.{nameof(_refreshIconVisual.Offset.Y)}", _offsetAnimation); _borderVisual.StartAnimation($"{nameof(_borderVisual.Offset)}.{nameof(_borderVisual.Offset.Y)}", _offsetAnimation); #endregion } }