private void Scroll(double delta) { if (_selecting) { return; } _selecting = true; var width = (float)ActualWidth; var current = -(_selectedIndex * width); var previous = current + width; var next = current - width; var maximum = next; var minimum = previous; if (_selectedIndex == 0) { minimum = current; delta = delta > 0 ? delta : 0; } else if (_selectedIndex == 5) { maximum = current; delta = delta < 0 ? delta : 0; } var offset = _layoutVisual.Offset; var batch = _layoutVisual.Compositor.CreateScopedBatch(CompositionBatchTypes.Animation); var animation = _layoutVisual.Compositor.CreateScalarKeyFrameAnimation(); animation.InsertKeyFrame(0, offset.X); if (delta < 0) { // previous _selectedIndex--; _renderer?.SetPage(_selectedIndex); animation.InsertKeyFrame(1, minimum); } else if (delta > 0) { // next _selectedIndex++; _renderer?.SetPage(_selectedIndex); animation.InsertKeyFrame(1, maximum); } else { // back animation.InsertKeyFrame(1, current); } _layoutVisual.StartAnimation("Offset.X", animation); SetIndex(_selectedIndex); batch.Completed += (s, args) => { _selecting = false; }; batch.End(); }
private void LayoutRoot_PointerWheelChanged(object sender, PointerRoutedEventArgs e) { if (_selecting) { return; } _selecting = true; var point = e.GetCurrentPoint(LayoutRoot); var delta = -point.Properties.MouseWheelDelta; var width = (float)ActualWidth; var current = -(_selectedIndex * width); var previous = current + width; var next = current - width; var maximum = next; var minimum = previous; if (_selectedIndex == 0) { minimum = current; delta = delta > 0 ? delta : 0; } else if (_selectedIndex == 5) { maximum = current; delta = delta < 0 ? delta : 0; } var offset = _layoutVisual.Offset; var batch = _layoutVisual.Compositor.CreateScopedBatch(CompositionBatchTypes.Animation); var animation = _layoutVisual.Compositor.CreateScalarKeyFrameAnimation(); animation.InsertKeyFrame(0, offset.X); if (delta < 0) { // previous _selectedIndex--; _renderer.SetPage(_selectedIndex); animation.InsertKeyFrame(1, minimum); } else if (delta > 0) { // next _selectedIndex++; _renderer.SetPage(_selectedIndex); animation.InsertKeyFrame(1, maximum); } else { // back animation.InsertKeyFrame(1, current); } _layoutVisual.StartAnimation("Offset.X", animation); batch.Completed += (s, args) => { _selecting = false; }; batch.End(); }