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