private static void OnMaximumChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            d.CoerceValue(RangeStartProperty);
            d.CoerceValue(RangeEndProperty);

            RangeSelector selector = (RangeSelector)d;

            if (!selector.IsLoaded)
            {
                return;
            }
            selector.ComputedStartOffset = selector.CalcY(selector.RangeStart, selector._startThumb, true);
            selector.ComputedEndOffset   = selector.CalcY(selector.RangeEnd, selector._endThumb, false);
            selector.ComputedRangeWidth  = selector.ComputedEndOffset - selector.ComputedStartOffset;
        }
        private static void OnRangeEndChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            RangeSelector selector = (RangeSelector)d;

            d.CoerceValue(RangeStartProperty);
            d.CoerceValue(MaximumProperty);

            if (!selector.IsLoaded)
            {
                return;
            }
            selector.ComputedEndOffset  = selector.CalcY((double)e.NewValue, selector._endThumb, false);
            selector.ComputedRangeWidth = selector.ComputedEndOffset - selector.ComputedStartOffset;

            selector.RaiseRangeChangedEvent(selector.RangeStart, (double)e.NewValue);
        }