diff --git a/demo/Ursa.Demo/Pages/RangeSliderDemo.axaml b/demo/Ursa.Demo/Pages/RangeSliderDemo.axaml index 68f58eb..cc75ae9 100644 --- a/demo/Ursa.Demo/Pages/RangeSliderDemo.axaml +++ b/demo/Ursa.Demo/Pages/RangeSliderDemo.axaml @@ -12,7 +12,7 @@ - + diff --git a/src/Ursa/Controls/RangeSlider/RangeSlider.cs b/src/Ursa/Controls/RangeSlider/RangeSlider.cs index 7da7cfa..d04ca64 100644 --- a/src/Ursa/Controls/RangeSlider/RangeSlider.cs +++ b/src/Ursa/Controls/RangeSlider/RangeSlider.cs @@ -239,9 +239,8 @@ public class RangeSlider: TemplatedControl private Thumb? GetThumbByPoint(PointerPoint point) { var isHorizontal = Orientation == Orientation.Horizontal; - var lowerThumbPosition = isHorizontal? _track?.LowerThumb?.Bounds.Position.X : _track?.LowerThumb?.Bounds.Position.Y; - var upperThumbPosition = isHorizontal? _track?.UpperThumb?.Bounds.Position.X : _track?.UpperThumb?.Bounds.Position.Y; - var thumbWidth = isHorizontal? _track?.LowerThumb?.Bounds.Width : _track?.LowerThumb?.Bounds.Height; + var lowerThumbPosition = isHorizontal? _track?.LowerThumb?.Bounds.Center.X : _track?.LowerThumb?.Bounds.Center.Y; + var upperThumbPosition = isHorizontal? _track?.UpperThumb?.Bounds.Center.X : _track?.UpperThumb?.Bounds.Center.Y; var pointerPosition = isHorizontal? point.Position.X : point.Position.Y; var lowerDistance = Math.Abs((lowerThumbPosition ?? 0) - pointerPosition); @@ -261,21 +260,28 @@ public class RangeSlider: TemplatedControl { if (_track is null) return 0; var isHorizontal = Orientation == Orientation.Horizontal; - var trackLength = _track.GetTrackLength(); + var pointPosition = isHorizontal ? point.Position.X : point.Position.Y; + var ratio = _track.GetRatioByPoint(pointPosition); + var range = Maximum - Minimum; + var finalValue = ratio * range + Minimum; + return finalValue; + /* + var trackLength = _track.GetTrackLength(); var thumbLength = _track.GetThumbLength() * 0.5; - if(pointPosition < thumbLength) + if(pointPosition < thumbLength * 0.5) return isHorizontal? Minimum : Maximum; - if (pointPosition > trackLength - thumbLength) + if (pointPosition > trackLength - thumbLength * 0.5) return isHorizontal? Maximum : Minimum; trackLength -= thumbLength * 2; pointPosition = MathUtilities.Clamp(pointPosition / trackLength, 0.0, 1.0); - var invert = isHorizontal - ? IsDirectionReversed ? 1.0 : 0 + var invert = isHorizontal + ? IsDirectionReversed ? 1.0 : 0 : IsDirectionReversed ? 0 : 1.0; var calValue = Math.Abs(invert - pointPosition); var range = Maximum - Minimum; var finalValue = calValue * range + Minimum; return finalValue; + */ } } \ No newline at end of file diff --git a/src/Ursa/Controls/RangeSlider/RangeTrack.cs b/src/Ursa/Controls/RangeSlider/RangeTrack.cs index 4c666c8..355a28f 100644 --- a/src/Ursa/Controls/RangeSlider/RangeTrack.cs +++ b/src/Ursa/Controls/RangeSlider/RangeTrack.cs @@ -495,4 +495,53 @@ public class RangeTrack: Control ? Bounds.Width : Bounds.Height; } + + internal double GetRatioByPoint(double position) + { + bool isHorizontal = Orientation == Orientation.Horizontal; + var range = LowerSection?.Bounds.Width + InnerSection?.Bounds.Width + UpperSection?.Bounds.Width ?? double.Epsilon; + if (isHorizontal) + { + + if (IsDirectionReversed) + { + double trackStart = UpperThumb?.Bounds.Width/2 ?? 0; + double trackEnd = trackStart + range; + if (position < trackStart) return 1.0; + if (position > trackEnd) return 0.0; + double diff = trackEnd - position; + return diff / range; + } + else + { + double trackStart = LowerThumb?.Bounds.Width/2 ?? 0; + double trackEnd = trackStart + range; + if (position < trackStart) return 0.0; + if (position > trackEnd) return 1.0; + double diff = position - trackStart; + return diff / range; + } + } + else + { + if (IsDirectionReversed) + { + double trackStart = UpperThumb?.Bounds.Height/2 ?? 0; + double trackEnd = trackStart + range; + if (position < trackStart) return 1.0; + if (position > trackEnd) return 0.0; + double diff = trackEnd - position; + return diff / range; + } + else + { + double trackStart = LowerThumb?.Bounds.Height/2 ?? 0; + double trackEnd = trackStart + range; + if (position < trackStart) return 0.0; + if (position > trackEnd) return 1.0; + double diff = position - trackStart; + return diff / range; + } + } + } } \ No newline at end of file