using System; using Xamarin.Forms.Internals; using Xamarin.Forms.Platform; namespace Xamarin.Forms { [RenderWith(typeof(_StepperRenderer))] public class Stepper : View, IElementConfiguration { public static readonly BindableProperty MaximumProperty = BindableProperty.Create("Maximum", typeof(double), typeof(Stepper), 100.0, validateValue: (bindable, value) => { var stepper = (Stepper)bindable; return (double)value > stepper.Minimum; }, coerceValue: (bindable, value) => { var stepper = (Stepper)bindable; stepper.Value = stepper.Value.Clamp(stepper.Minimum, (double)value); return value; }); public static readonly BindableProperty MinimumProperty = BindableProperty.Create("Minimum", typeof(double), typeof(Stepper), 0.0, validateValue: (bindable, value) => { var stepper = (Stepper)bindable; return (double)value < stepper.Maximum; }, coerceValue: (bindable, value) => { var stepper = (Stepper)bindable; stepper.Value = stepper.Value.Clamp((double)value, stepper.Maximum); return value; }); public static readonly BindableProperty ValueProperty = BindableProperty.Create("Value", typeof(double), typeof(Stepper), 0.0, BindingMode.TwoWay, coerceValue: (bindable, value) => { var stepper = (Stepper)bindable; return ((double)value).Clamp(stepper.Minimum, stepper.Maximum); }, propertyChanged: (bindable, oldValue, newValue) => { var stepper = (Stepper)bindable; EventHandler eh = stepper.ValueChanged; if (eh != null) eh(stepper, new ValueChangedEventArgs((double)oldValue, (double)newValue)); }); public static readonly BindableProperty IncrementProperty = BindableProperty.Create("Increment", typeof(double), typeof(Stepper), 1.0); readonly Lazy> _platformConfigurationRegistry; public Stepper() { _platformConfigurationRegistry = new Lazy>(() => new PlatformConfigurationRegistry(this)); } public Stepper(double min, double max, double val, double increment) { if (min >= max) throw new ArgumentOutOfRangeException("min"); if (max > Minimum) { Maximum = max; Minimum = min; } else { Minimum = min; Maximum = max; } Value = val.Clamp(min, max); Increment = increment; } public double Increment { get { return (double)GetValue(IncrementProperty); } set { SetValue(IncrementProperty, value); } } public double Maximum { get { return (double)GetValue(MaximumProperty); } set { SetValue(MaximumProperty, value); } } public double Minimum { get { return (double)GetValue(MinimumProperty); } set { SetValue(MinimumProperty, value); } } public double Value { get { return (double)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } public event EventHandler ValueChanged; public IPlatformElementConfiguration On() where T : IConfigPlatform { return _platformConfigurationRegistry.Value.On(); } } }