@@ -26,8 +26,6 @@ public class RangeTrack : FrameworkElement
2626
2727 private double Density { get ; set ; } = double . NaN ;
2828
29- private double ThumbStartCenterOffset { get ; set ; } = double . NaN ;
30-
3129 public RepeatButton DecreaseRepeatButton
3230 {
3331 get => _decreaseButton ;
@@ -257,13 +255,12 @@ protected override Size ArrangeOverride(Size arrangeSize)
257255 : increaseButtonLength + thumbStartLength + centerButtonLength ;
258256 pieceSize . Height = thumbStartLength ;
259257
260- ThumbStart ? . Arrange ( new Rect ( offset , pieceSize ) ) ;
261- ThumbStartCenterOffset = offset . Y + thumbStartLength * 0.5 ;
258+ ArrangeThumb ( isDirectionReversed , false , offset , pieceSize ) ;
262259
263260 offset . Y = isDirectionReversed ? decreaseButtonLength : increaseButtonLength ;
264261 pieceSize . Height = thumbEndLength ;
265262
266- ThumbEnd ? . Arrange ( new Rect ( offset , pieceSize ) ) ;
263+ ArrangeThumb ( isDirectionReversed , true , offset , pieceSize ) ;
267264 }
268265 else
269266 {
@@ -291,20 +288,45 @@ protected override Size ArrangeOverride(Size arrangeSize)
291288 offset . X = isDirectionReversed ? increaseButtonLength : decreaseButtonLength ;
292289 pieceSize . Width = thumbStartLength ;
293290
294- ThumbStart ? . Arrange ( new Rect ( offset , pieceSize ) ) ;
295- ThumbStartCenterOffset = offset . X + thumbStartLength * 0.5 ;
291+ ArrangeThumb ( isDirectionReversed , false , offset , pieceSize ) ;
296292
297293 offset . X = isDirectionReversed
298294 ? increaseButtonLength + thumbStartLength + centerButtonLength
299295 : decreaseButtonLength + thumbEndLength + centerButtonLength ;
300296 pieceSize . Width = thumbEndLength ;
301297
302- ThumbEnd ? . Arrange ( new Rect ( offset , pieceSize ) ) ;
298+ ArrangeThumb ( isDirectionReversed , true , offset , pieceSize ) ;
303299 }
304300
305301 return arrangeSize ;
306302 }
307303
304+ private void ArrangeThumb ( bool isDirectionReversed , bool isStart , Point offset , Size pieceSize )
305+ {
306+ if ( isStart )
307+ {
308+ if ( isDirectionReversed )
309+ {
310+ ThumbStart ? . Arrange ( new Rect ( offset , pieceSize ) ) ;
311+ }
312+ else
313+ {
314+ ThumbEnd ? . Arrange ( new Rect ( offset , pieceSize ) ) ;
315+ }
316+ }
317+ else
318+ {
319+ if ( isDirectionReversed )
320+ {
321+ ThumbEnd ? . Arrange ( new Rect ( offset , pieceSize ) ) ;
322+ }
323+ else
324+ {
325+ ThumbStart ? . Arrange ( new Rect ( offset , pieceSize ) ) ;
326+ }
327+ }
328+ }
329+
308330 private void ComputeLengths ( Size arrangeSize , bool isVertical , out double decreaseButtonLength ,
309331 out double centerButtonLength , out double increaseButtonLength , out double thumbStartLength ,
310332 out double thumbEndLength )
@@ -372,17 +394,13 @@ private static void OnIsEnabledChanged(DependencyObject d, DependencyPropertyCha
372394
373395 public virtual double ValueFromPoint ( Point pt )
374396 {
375- double val ;
376- // Find distance from center of thumb to given point.
377- if ( Orientation == Orientation . Horizontal )
378- {
379- val = ValueStart + ValueFromDistance ( pt . X - ThumbStartCenterOffset , pt . Y - RenderSize . Height * 0.5 ) ;
380- }
381- else
382- {
383- val = ValueStart + ValueFromDistance ( pt . X - RenderSize . Width * 0.5 , pt . Y - ThumbStartCenterOffset ) ;
384- }
385- return Math . Max ( Minimum , Math . Min ( Maximum , val ) ) ;
397+ return Orientation == Orientation . Horizontal
398+ ? ! IsDirectionReversed
399+ ? pt . X / RenderSize . Width * Maximum
400+ : ( 1 - pt . X / RenderSize . Width ) * Maximum
401+ : ! IsDirectionReversed
402+ ? pt . Y / RenderSize . Height * Maximum
403+ : ( 1 - pt . X / RenderSize . Height ) * Maximum ;
386404 }
387405
388406 public virtual double ValueFromDistance ( double horizontal , double vertical )
0 commit comments