diff --git a/src/AlohaKit.Gallery/Views/SliderView.xaml b/src/AlohaKit.Gallery/Views/SliderView.xaml index 2ad94a8..d1b6829 100644 --- a/src/AlohaKit.Gallery/Views/SliderView.xaml +++ b/src/AlohaKit.Gallery/Views/SliderView.xaml @@ -125,8 +125,17 @@ - + + diff --git a/src/AlohaKit/Controls/Slider/Slider.cs b/src/AlohaKit/Controls/Slider/Slider.cs index e17fc6f..ed4a024 100644 --- a/src/AlohaKit/Controls/Slider/Slider.cs +++ b/src/AlohaKit/Controls/Slider/Slider.cs @@ -148,6 +148,23 @@ public ThumbShape ThumbShape set => SetValue(ThumbShapeProperty, value); } + public static readonly BindableProperty IsReversedProperty = + BindableProperty.Create(nameof(IsReversed), typeof(bool), typeof(Slider), false, + propertyChanged: (bindableObject, oldValue, newValue) => + { + if (newValue != null && bindableObject is Slider slider) + { + slider.UpdateValue(); + slider.ValueChanged?.Invoke(slider, new ValueChangedEventArgs((double)oldValue, (double)newValue)); + } + }); + + public bool IsReversed + { + get => (bool)GetValue(IsReversedProperty); + set => SetValue(IsReversedProperty, value); + } + public event EventHandler ValueChanged; protected override void OnParentSet() @@ -182,7 +199,7 @@ void UpdateMinimum() if (SliderDrawable == null) return; - SliderDrawable.Minimum = Minimum; + SliderDrawable.Minimum = IsReversed ? Maximum : Minimum; Invalidate(); } @@ -192,7 +209,7 @@ void UpdateMaximum() if (SliderDrawable == null) return; - SliderDrawable.Maximum = Maximum; + SliderDrawable.Maximum = IsReversed ? Minimum : Maximum; Invalidate(); } @@ -203,7 +220,15 @@ void UpdateValue() return; Value = Math.Clamp(Value, Minimum, Maximum); - SliderDrawable.Value = Value; + + double adjustedValue = Value; + + if (IsReversed) + { + adjustedValue = Maximum - (Value - Minimum); + } + + SliderDrawable.Value = adjustedValue; Invalidate(); } @@ -262,7 +287,9 @@ void OnSliderDragInteraction(object sender, TouchEventArgs args) void UpdateValueFromInteraction(PointF touchPoint) { - Value = touchPoint.X * Maximum / Width; + double adjustedTouchPointX = IsReversed ? (Width - touchPoint.X) : touchPoint.X; + + Value = adjustedTouchPointX * Maximum / Width; } } } \ No newline at end of file