Exemplo n.º 1
0
        /// <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);
        }