/// <inheritdoc /> protected override Size ArrangeOverride(Size arrangeSize) { var max = Maximum; if (max == 0) { max = 1; } var progressX = Value / max * arrangeSize.Width; IncreaseRepeatButton.Arrange(new Rect(0, 0, arrangeSize.Width, Thumb.DesiredSize.Height)); DecreaseRepeatButton.Arrange(new Rect(0, 0, progressX, Thumb.DesiredSize.Height)); var thumbXPos = progressX - (Thumb.DesiredSize.Width / 2); Thumb.Arrange(new Rect(thumbXPos, 0, Thumb.DesiredSize.Width, Thumb.DesiredSize.Height)); if (Maximum != 0) { _distanceUnits = Maximum / arrangeSize.Width; } return(arrangeSize); }
/// <summary> /// Children will be stretched to fit horizontally (if vertically oriented) or vertically (if horizontally /// oriented). /// /// There are essentially three possible layout states: /// 1. The track is enabled and the thumb is proportionally sizing. /// 2. The track is enabled and the thumb has reached its minimum size. /// 3. The track is disabled or there is not enough room for the thumb. /// Track elements are not displayed, and will not be arranged. /// <seealso cref="FrameworkElement.ArrangeOverride" /> /// </summary> protected override Size ArrangeOverride(Size arrangeSize) { double decreaseButtonLength, thumbLength, increaseButtonLength; bool isVertical = (Orientation == Orientation.Vertical); double viewportSize = Math.Max(0.0, ViewportSize); // If viewport is NaN, compute thumb's size based on its desired size, // otherwise compute the thumb base on the viewport and extent properties if (double.IsNaN(viewportSize)) { ComputeSliderLengths(arrangeSize, isVertical, out decreaseButtonLength, out thumbLength, out increaseButtonLength); } else { // Don't arrange if there's not enough content or the track is too small if (!ComputeScrollBarLengths(arrangeSize, viewportSize, isVertical, out decreaseButtonLength, out thumbLength, out increaseButtonLength)) { return(arrangeSize); } } // Layout the pieces of track Point offset = new Point(); Size pieceSize = arrangeSize; bool isDirectionReversed = IsDirectionReversed; if (isVertical) { // Vertical Normal : |Inc Button | // |Thumb | // |Dec Button | // Vertical Reversed : |Dec Button | // |Thumb | // |Inc Button | CoerceLength(ref decreaseButtonLength, arrangeSize.Height); CoerceLength(ref increaseButtonLength, arrangeSize.Height); CoerceLength(ref thumbLength, arrangeSize.Height); offset.Y = isDirectionReversed ? decreaseButtonLength + thumbLength : 0.0; pieceSize.Height = increaseButtonLength; if (IncreaseRepeatButton != null) { IncreaseRepeatButton.Arrange(new Rect(offset, pieceSize)); } offset.Y = isDirectionReversed ? 0.0 : increaseButtonLength + thumbLength; pieceSize.Height = decreaseButtonLength; if (DecreaseRepeatButton != null) { DecreaseRepeatButton.Arrange(new Rect(offset, pieceSize)); } offset.Y = isDirectionReversed ? decreaseButtonLength : increaseButtonLength; pieceSize.Height = thumbLength; if (Thumb != null) { Thumb.Arrange(new Rect(offset, pieceSize)); } ThumbCenterOffset = offset.Y + (thumbLength * 0.5); } else { // Horizontal Normal : |Dec Button |Thumb| Inc Button| // Horizontal Reversed : |Inc Button |Thumb| Dec Button| CoerceLength(ref decreaseButtonLength, arrangeSize.Width); CoerceLength(ref increaseButtonLength, arrangeSize.Width); CoerceLength(ref thumbLength, arrangeSize.Width); offset.X = isDirectionReversed ? increaseButtonLength + thumbLength : 0.0; pieceSize.Width = decreaseButtonLength; if (DecreaseRepeatButton != null) { DecreaseRepeatButton.Arrange(new Rect(offset, pieceSize)); } offset.X = isDirectionReversed ? 0.0 : decreaseButtonLength + thumbLength; pieceSize.Width = increaseButtonLength; if (IncreaseRepeatButton != null) { IncreaseRepeatButton.Arrange(new Rect(offset, pieceSize)); } offset.X = isDirectionReversed ? increaseButtonLength : decreaseButtonLength; pieceSize.Width = thumbLength; if (Thumb != null) { Thumb.Arrange(new Rect(offset, pieceSize)); } ThumbCenterOffset = offset.X + (thumbLength * 0.5); } return(arrangeSize); }
protected override Size ArrangeOverride(Size arrangeSize) { base.ArrangeOverride(arrangeSize); var isVertical = Orientation == Orientation.Vertical; ComputeSliderLengths(arrangeSize, isVertical, out var decreaseButtonLength, out var thumbLength, out var increaseButtonLength); var offset = new Point(); var pieceSize = arrangeSize; var isDirectionReversed = IsDirectionReversed; if (isVertical) { CoerceLength(ref decreaseButtonLength, arrangeSize.Height); CoerceLength(ref increaseButtonLength, arrangeSize.Height); CoerceLength(ref thumbLength, arrangeSize.Height); offset.Y = isDirectionReversed ? decreaseButtonLength + thumbLength : 0.0; pieceSize.Height = increaseButtonLength; IncreaseRepeatButton?.Arrange(new Rect(offset, pieceSize)); offset.Y = isDirectionReversed ? 0.0 : increaseButtonLength + thumbLength; pieceSize.Height = decreaseButtonLength; if (DecreaseRepeatButton != null) { DecreaseRepeatButton.Arrange(new Rect(offset, pieceSize)); DecreaseRepeatButton.Height = pieceSize.Height; } offset.Y = isDirectionReversed ? decreaseButtonLength : increaseButtonLength; pieceSize.Height = thumbLength; Thumb?.Arrange(new Rect(offset, pieceSize)); } else { CoerceLength(ref decreaseButtonLength, arrangeSize.Width); CoerceLength(ref increaseButtonLength, arrangeSize.Width); CoerceLength(ref thumbLength, arrangeSize.Width); offset.X = isDirectionReversed ? increaseButtonLength + thumbLength : 0.0; pieceSize.Width = decreaseButtonLength; DecreaseRepeatButton?.Arrange(new Rect(offset, pieceSize)); offset.X = isDirectionReversed ? 0.0 : decreaseButtonLength + thumbLength; pieceSize.Width = increaseButtonLength; if (IncreaseRepeatButton != null) { IncreaseRepeatButton.Arrange(new Rect(offset, pieceSize)); IncreaseRepeatButton.Width = pieceSize.Width; } offset.X = isDirectionReversed ? increaseButtonLength : decreaseButtonLength; pieceSize.Width = thumbLength; Thumb?.Arrange(new Rect(offset, pieceSize)); } return(arrangeSize); }