Guest User

Untitled

a guest
Jul 17th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.94 KB | None | 0 0
  1. public class Carousel : ItemsControl
  2. {
  3. private ScrollViewer _scrollviewer;
  4.  
  5. private ScrollViewer ScrollViewer => _scrollviewer ?? (_scrollviewer = (ScrollViewer)GetTemplateChild("PART_scroller"));
  6.  
  7. protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
  8. {
  9. if (element is FrameworkElement fe)
  10. {
  11. var sv = ScrollViewer;
  12. fe.SetBinding(MaxWidthProperty, new Binding { Path = new PropertyPath(nameof(ScrollViewer.ViewportWidth)), Source = sv, Converter = new ItemsSizeConverter() });
  13. }
  14. base.PrepareContainerForItemOverride(element, item);
  15. }
  16.  
  17. class ItemsSizeConverter : IValueConverter
  18. {
  19. object IValueConverter.Convert(object value, Type targetType, object parameter, string language)
  20. => value is double d ? d * 0.9 : DependencyProperty.UnsetValue;
  21. object IValueConverter.ConvertBack(object value, Type targetType, object parameter, string language) => throw new NotImplementedException();
  22. }
  23. }
  24.  
  25. public class CarouselPanel : StackPanel, IScrollSnapPointsInfo
  26. {
  27. public const double OutsideGutter = 100;
  28.  
  29. public CarouselPanel()
  30. {
  31. Orientation = Orientation.Horizontal;
  32. Padding = new Thickness(OutsideGutter, 0, OutsideGutter, 0);
  33. }
  34.  
  35. IReadOnlyList<float> IScrollSnapPointsInfo.GetIrregularSnapPoints(Orientation orientation, SnapPointsAlignment alignment)
  36. {
  37. if (orientation == Orientation.Vertical)
  38. return Array.Empty<float>();
  39.  
  40. return points().ToArray();
  41.  
  42. IEnumerable<float> points()
  43. {
  44. yield return 0f;
  45. var x = OutsideGutter;// this.FindParent<ScrollViewer>().ViewportWidth * 0.1;
  46. foreach (var c in Children.OfType<FrameworkElement>())
  47. {
  48. yield return (float)(x + c.ActualWidth / 2);
  49. x += c.ActualWidth;
  50. }
  51. yield return (float)ActualWidth;
  52. }
  53. }
  54. }
Add Comment
Please, Sign In to add comment