diff options
Diffstat (limited to 'Xamarin.Forms.Core/CarouselView.cs')
-rw-r--r-- | Xamarin.Forms.Core/CarouselView.cs | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core/CarouselView.cs b/Xamarin.Forms.Core/CarouselView.cs new file mode 100644 index 00000000..62e9393e --- /dev/null +++ b/Xamarin.Forms.Core/CarouselView.cs @@ -0,0 +1,86 @@ +using System; +using Xamarin.Forms.Platform; + +namespace Xamarin.Forms +{ + [RenderWith(typeof(_CarouselViewRenderer))] + public class CarouselView : ItemsView, ICarouselViewController + { + public static readonly BindableProperty PositionProperty = BindableProperty.Create(nameof(Position), typeof(int), typeof(CarouselView), 0, BindingMode.TwoWay); + + public static readonly BindableProperty ItemProperty = BindableProperty.Create(nameof(Item), typeof(object), typeof(CarouselView), 0, BindingMode.TwoWay); + + object _lastItem; + + int _lastPosition; + + public CarouselView() + { + _lastPosition = 0; + _lastItem = null; + VerticalOptions = LayoutOptions.FillAndExpand; + HorizontalOptions = LayoutOptions.FillAndExpand; + } + + public int Item + { + get { return (int)GetValue(ItemProperty); } + } + + public int Position + { + get { return (int)GetValue(PositionProperty); } + set { SetValue(PositionProperty, value); } + } + + void ICarouselViewController.SendPositionAppearing(int position) + { + ItemAppearing?.Invoke(this, new ItemVisibilityEventArgs(GetItem(position))); + } + + void ICarouselViewController.SendPositionDisappearing(int position) + { + ItemDisappearing?.Invoke(this, new ItemVisibilityEventArgs(GetItem(position))); + } + + void ICarouselViewController.SendSelectedItemChanged(object item) + { + if (item.Equals(_lastItem)) + return; + + ItemSelected?.Invoke(this, new SelectedItemChangedEventArgs(item)); + _lastItem = item; + } + + void ICarouselViewController.SendSelectedPositionChanged(int position) + { + if (_lastPosition == position) + return; + + _lastPosition = position; + PositionSelected?.Invoke(this, new SelectedPositionChangedEventArgs(position)); + } + + public event EventHandler<SelectedItemChangedEventArgs> ItemSelected; + + public event EventHandler<SelectedPositionChangedEventArgs> PositionSelected; + + protected override SizeRequest OnMeasure(double widthConstraint, double heightConstraint) + { + var minimumSize = new Size(40, 40); + return new SizeRequest(minimumSize, minimumSize); + } + + // non-public bc unable to implement on iOS + internal event EventHandler<ItemVisibilityEventArgs> ItemAppearing; + + internal event EventHandler<ItemVisibilityEventArgs> ItemDisappearing; + + object GetItem(int position) + { + var controller = (IItemViewController)this; + object item = controller.GetItem(position); + return item; + } + } +}
\ No newline at end of file |