feat: refactor length calculation.

This commit is contained in:
rabbitism
2024-01-19 18:28:05 +08:00
parent 22ed164cf5
commit 236a44c62c
3 changed files with 64 additions and 9 deletions

View File

@@ -12,7 +12,7 @@
</Style>
</UserControl.Styles>
<StackPanel>
<u:RangeSlider Name="range" Height="24" TickFrequency="5" IsSnapToTick="False"/>
<u:RangeSlider Name="range" Height="24" TickFrequency="5" IsSnapToTick="True"/>
<u:NumericDoubleUpDown InnerLeftContent="Minimum" Value="{Binding #range.Minimum, Mode=TwoWay}" />
<u:NumericDoubleUpDown InnerLeftContent="Maximum" Value="{Binding #range.Maximum, Mode=TwoWay}" />
<u:NumericDoubleUpDown InnerLeftContent="LowerValue" Value="{Binding #range.LowerValue, Mode=TwoWay}" />

View File

@@ -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;
*/
}
}

View File

@@ -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;
}
}
}
}