Exemplo n.º 1
0
        /// <summary>
        /// Arrange a sequence of elements in a single line.
        /// </summary>
        /// <param name="lineStart">
        /// Index of the first element in the sequence to arrange.
        /// </param>
        /// <param name="lineEnd">
        /// Index of the last element in the sequence to arrange.
        /// </param>
        /// <param name="directDelta">
        /// Optional fixed growth in the primary direction.
        /// </param>
        /// <param name="indirectOffset">
        /// Offset of the line in the indirect direction.
        /// </param>
        /// <param name="indirectGrowth">
        /// Shared indirect growth of the elements on this line.
        /// </param>
        private void ArrangeLine(int lineStart, int lineEnd, double?directDelta, double indirectOffset, double indirectGrowth)
        {
            double directOffset = 0.0;

            Orientation o            = Orientation;
            bool        isHorizontal = o == Orientation.Horizontal;

            UIElementCollection children = Children;

            for (int index = lineStart; index < lineEnd; index++)
            {
                // Get the size of the element
                UIElement    element     = children[index];
                OrientedSize elementSize = new OrientedSize(o, element.DesiredSize.Width, element.DesiredSize.Height);

                // Determine if we should use the element's desired size or the
                // fixed item width or height
                double directGrowth = directDelta != null ?
                                      directDelta.Value :
                                      elementSize.Direct;

                // Arrange the element
                Rect bounds = isHorizontal ?
                              new Rect(directOffset, indirectOffset, directGrowth, indirectGrowth) :
                              new Rect(indirectOffset, directOffset, indirectGrowth, directGrowth);
                element.Arrange(bounds);

                directOffset += directGrowth;
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Arranges and sizes the
        /// <see cref="T:WinRTXamlToolkit.Controls.WrapPanel" /> control and its
        /// child elements.
        /// </summary>
        /// <param name="finalSize">
        /// The area within the parent that the
        /// <see cref="T:WinRTXamlToolkit.Controls.WrapPanel" /> should use
        /// arrange itself and its children.
        /// </param>
        /// <returns>
        /// The actual size used by the
        /// <see cref="T:WinRTXamlToolkit.Controls.WrapPanel" />.
        /// </returns>
        protected override Size ArrangeOverride(Size finalSize)
        {
            // Variables tracking the size of the current line, and the maximum
            // size available to fill.  Note that the line might represent a row
            // or a column depending on the orientation.
            Orientation  o           = Orientation;
            OrientedSize lineSize    = new OrientedSize(o);
            OrientedSize maximumSize = new OrientedSize(o, finalSize.Width, finalSize.Height);

            // Determine the constraints for individual items
            double itemWidth      = ItemWidth;
            double itemHeight     = ItemHeight;
            bool   hasFixedWidth  = !itemWidth.IsNaN();
            bool   hasFixedHeight = !itemHeight.IsNaN();
            double indirectOffset = 0;
            double?directDelta    = (o == Orientation.Horizontal) ?
                                    (hasFixedWidth ? (double?)itemWidth : null) :
                                    (hasFixedHeight ? (double?)itemHeight : null);

            // Measure each of the Children.  We will process the elements one
            // line at a time, just like during measure, but we will wait until
            // we've completed an entire line of elements before arranging them.
            // The lineStart and lineEnd variables track the size of the
            // currently arranged line.
            UIElementCollection children = Children;
            int count     = children.Count;
            int lineStart = 0;

            for (int lineEnd = 0; lineEnd < count; lineEnd++)
            {
                UIElement element = children[lineEnd];

                // Get the size of the element
                OrientedSize elementSize = new OrientedSize(
                    o,
                    hasFixedWidth ? itemWidth : element.DesiredSize.Width,
                    hasFixedHeight ? itemHeight : element.DesiredSize.Height);

                // If this element falls of the edge of the line
                if (NumericExtensions.IsGreaterThan(lineSize.Direct + elementSize.Direct, maximumSize.Direct))
                {
                    // Then we just completed a line and we should arrange it
                    ArrangeLine(lineStart, lineEnd, directDelta, indirectOffset, lineSize.Indirect);

                    // Move the current element to a new line
                    indirectOffset += lineSize.Indirect;
                    lineSize        = elementSize;

                    // If the current element is larger than the maximum size
                    if (NumericExtensions.IsGreaterThan(elementSize.Direct, maximumSize.Direct))
                    {
                        // Arrange the element as a single line
                        ArrangeLine(lineEnd, ++lineEnd, directDelta, indirectOffset, elementSize.Indirect);

                        // Move to a new line
                        indirectOffset += lineSize.Indirect;
                        lineSize        = new OrientedSize(o);
                    }

                    // Advance the start index to a new line after arranging
                    lineStart = lineEnd;
                }
                else
                {
                    // Otherwise just add the element to the end of the line
                    lineSize.Direct  += elementSize.Direct;
                    lineSize.Indirect = Math.Max(lineSize.Indirect, elementSize.Indirect);
                }
            }

            // Arrange any elements on the last line
            if (lineStart < count)
            {
                ArrangeLine(lineStart, count, directDelta, indirectOffset, lineSize.Indirect);
            }

            return(finalSize);
        }
Exemplo n.º 3
0
        protected override Size MeasureOverride(Size constraint)
        {
            // Variables tracking the size of the current line, the total size
            // measured so far, and the maximum size available to fill.  Note
            // that the line might represent a row or a column depending on the
            // orientation.
            Orientation  o           = Orientation;
            OrientedSize lineSize    = new OrientedSize(o);
            OrientedSize totalSize   = new OrientedSize(o);
            OrientedSize maximumSize = new OrientedSize(o, constraint.Width, constraint.Height);

            // Determine the constraints for individual items
            double itemWidth      = ItemWidth;
            double itemHeight     = ItemHeight;
            bool   hasFixedWidth  = !double.IsNaN(itemWidth);
            bool   hasFixedHeight = !double.IsNaN(itemHeight);
            Size   itemSize       = new Size(
                hasFixedWidth ? itemWidth : constraint.Width,
                hasFixedHeight ? itemHeight : constraint.Height);

            // Measure each of the Children
            foreach (UIElement element in Children)
            {
                // Determine the size of the element
                element.Measure(itemSize);
                OrientedSize elementSize = new OrientedSize(
                    o,
                    hasFixedWidth ? itemWidth : element.DesiredSize.Width,
                    hasFixedHeight ? itemHeight : element.DesiredSize.Height);

                // If this element falls of the edge of the line
                if (NumericExtensions.IsGreaterThan(lineSize.Direct + elementSize.Direct, maximumSize.Direct))
                {
                    // Update the total size with the direct and indirect growth
                    // for the current line
                    totalSize.Direct    = Math.Max(lineSize.Direct, totalSize.Direct);
                    totalSize.Indirect += lineSize.Indirect;

                    // Move the element to a new line
                    lineSize = elementSize;

                    // If the current element is larger than the maximum size,
                    // place it on a line by itself
                    if (NumericExtensions.IsGreaterThan(elementSize.Direct, maximumSize.Direct))
                    {
                        // Update the total size for the line occupied by this
                        // single element
                        totalSize.Direct    = Math.Max(elementSize.Direct, totalSize.Direct);
                        totalSize.Indirect += elementSize.Indirect;

                        // Move to a new line
                        lineSize = new OrientedSize(o);
                    }
                }
                else
                {
                    // Otherwise just add the element to the end of the line
                    lineSize.Direct  += elementSize.Direct;
                    lineSize.Indirect = Math.Max(lineSize.Indirect, elementSize.Indirect);
                }
            }

            // Update the total size with the elements on the last line
            totalSize.Direct    = Math.Max(lineSize.Direct, totalSize.Direct);
            totalSize.Indirect += lineSize.Indirect;

            // Return the total size required as an un-oriented quantity
            return(new Size(totalSize.Width, totalSize.Height));
        }
Exemplo n.º 4
0
		/// <summary>
		/// Arrange a sequence of elements in a single line.
		/// </summary>
		/// <param name="lineStart">
		/// Index of the first element in the sequence to arrange.
		/// </param>
		/// <param name="lineEnd">
		/// Index of the last element in the sequence to arrange.
		/// </param>
		/// <param name="directDelta">
		/// Optional fixed growth in the primary direction.
		/// </param>
		/// <param name="indirectOffset">
		/// Offset of the line in the indirect direction.
		/// </param>
		/// <param name="indirectGrowth">
		/// Shared indirect growth of the elements on this line.
		/// </param>
		private void ArrangeLine(int lineStart, int lineEnd, double? directDelta, double indirectOffset, double indirectGrowth)
		{
			double directOffset = 0.0;

			Orientation o = Orientation;
			bool isHorizontal = o == Orientation.Horizontal;

			UIElementCollection children = Children;
			for (int index = lineStart; index < lineEnd; index++)
			{
				// Get the size of the element
				UIElement element = children[index];
				OrientedSize elementSize = new OrientedSize(o, element.DesiredSize.Width, element.DesiredSize.Height);

				// Determine if we should use the element's desired size or the
				// fixed item width or height
				double directGrowth = directDelta != null ?
					directDelta.Value :
					elementSize.Direct;

				// Arrange the element
				Rect bounds = isHorizontal ?
					new Rect(directOffset, indirectOffset, directGrowth, indirectGrowth) :
					new Rect(indirectOffset, directOffset, indirectGrowth, directGrowth);
				element.Arrange(bounds);

				directOffset += directGrowth;
			}
		}
Exemplo n.º 5
0
		/// <summary>
		/// Arranges and sizes the
		/// <see cref="T:WinRTXamlToolkit.Controls.WrapPanel" /> control and its
		/// child elements.
		/// </summary>
		/// <param name="finalSize">
		/// The area within the parent that the
		/// <see cref="T:WinRTXamlToolkit.Controls.WrapPanel" /> should use 
		/// arrange itself and its children.
		/// </param>
		/// <returns>
		/// The actual size used by the
		/// <see cref="T:WinRTXamlToolkit.Controls.WrapPanel" />.
		/// </returns>
		protected override Size ArrangeOverride(Size finalSize)
		{
			// Variables tracking the size of the current line, and the maximum
			// size available to fill.  Note that the line might represent a row
			// or a column depending on the orientation.
			Orientation o = Orientation;
			OrientedSize lineSize = new OrientedSize(o);
			OrientedSize maximumSize = new OrientedSize(o, finalSize.Width, finalSize.Height);

			// Determine the constraints for individual items
			double itemWidth = ItemWidth;
			double itemHeight = ItemHeight;
			bool hasFixedWidth = !itemWidth.IsNaN();
			bool hasFixedHeight = !itemHeight.IsNaN();
			double indirectOffset = 0;
			double? directDelta = (o == Orientation.Horizontal) ?
				(hasFixedWidth ? (double?)itemWidth : null) :
				(hasFixedHeight ? (double?)itemHeight : null);

			// Measure each of the Children.  We will process the elements one
			// line at a time, just like during measure, but we will wait until
			// we've completed an entire line of elements before arranging them.
			// The lineStart and lineEnd variables track the size of the
			// currently arranged line.
			UIElementCollection children = Children;
			int count = children.Count;
			int lineStart = 0;
			for (int lineEnd = 0; lineEnd < count; lineEnd++)
			{
				UIElement element = children[lineEnd];

				// Get the size of the element
				OrientedSize elementSize = new OrientedSize(
					o,
					hasFixedWidth ? itemWidth : element.DesiredSize.Width,
					hasFixedHeight ? itemHeight : element.DesiredSize.Height);

				// If this element falls of the edge of the line
				if (NumericExtensions.IsGreaterThan(lineSize.Direct + elementSize.Direct, maximumSize.Direct))
				{
					// Then we just completed a line and we should arrange it
					ArrangeLine(lineStart, lineEnd, directDelta, indirectOffset, lineSize.Indirect);

					// Move the current element to a new line
					indirectOffset += lineSize.Indirect;
					lineSize = elementSize;

					// If the current element is larger than the maximum size
					if (NumericExtensions.IsGreaterThan(elementSize.Direct, maximumSize.Direct))
					{
						// Arrange the element as a single line
						ArrangeLine(lineEnd, ++lineEnd, directDelta, indirectOffset, elementSize.Indirect);

						// Move to a new line
						indirectOffset += lineSize.Indirect;
						lineSize = new OrientedSize(o);
					}

					// Advance the start index to a new line after arranging
					lineStart = lineEnd;
				}
				else
				{
					// Otherwise just add the element to the end of the line
					lineSize.Direct += elementSize.Direct;
					lineSize.Indirect = Math.Max(lineSize.Indirect, elementSize.Indirect);
				}
			}

			// Arrange any elements on the last line
			if (lineStart < count)
			{
				ArrangeLine(lineStart, count, directDelta, indirectOffset, lineSize.Indirect);
			}

			return finalSize;
		}
Exemplo n.º 6
0
		protected override Size MeasureOverride(Size constraint)
		{
			// Variables tracking the size of the current line, the total size
			// measured so far, and the maximum size available to fill.  Note
			// that the line might represent a row or a column depending on the
			// orientation.
			Orientation o = Orientation;
			OrientedSize lineSize = new OrientedSize(o);
			OrientedSize totalSize = new OrientedSize(o);
			OrientedSize maximumSize = new OrientedSize(o, constraint.Width, constraint.Height);

			// Determine the constraints for individual items
			double itemWidth = ItemWidth;
			double itemHeight = ItemHeight;
			bool hasFixedWidth = !double.IsNaN(itemWidth);
			bool hasFixedHeight = !double.IsNaN(itemHeight);
			Size itemSize = new Size(
				hasFixedWidth ? itemWidth : constraint.Width,
				hasFixedHeight ? itemHeight : constraint.Height);

			// Measure each of the Children
			foreach (UIElement element in Children)
			{
				// Determine the size of the element
				element.Measure(itemSize);
				OrientedSize elementSize = new OrientedSize(
					o,
					hasFixedWidth ? itemWidth : element.DesiredSize.Width,
					hasFixedHeight ? itemHeight : element.DesiredSize.Height);

				// If this element falls of the edge of the line
				if (NumericExtensions.IsGreaterThan(lineSize.Direct + elementSize.Direct, maximumSize.Direct))
				{
					// Update the total size with the direct and indirect growth
					// for the current line
					totalSize.Direct = Math.Max(lineSize.Direct, totalSize.Direct);
					totalSize.Indirect += lineSize.Indirect;

					// Move the element to a new line
					lineSize = elementSize;

					// If the current element is larger than the maximum size,
					// place it on a line by itself
					if (NumericExtensions.IsGreaterThan(elementSize.Direct, maximumSize.Direct))
					{
						// Update the total size for the line occupied by this
						// single element
						totalSize.Direct = Math.Max(elementSize.Direct, totalSize.Direct);
						totalSize.Indirect += elementSize.Indirect;

						// Move to a new line
						lineSize = new OrientedSize(o);
					}
				}
				else
				{
					// Otherwise just add the element to the end of the line
					lineSize.Direct += elementSize.Direct;
					lineSize.Indirect = Math.Max(lineSize.Indirect, elementSize.Indirect);
				}
			}

			// Update the total size with the elements on the last line
			totalSize.Direct = Math.Max(lineSize.Direct, totalSize.Direct);
			totalSize.Indirect += lineSize.Indirect;

			// Return the total size required as an un-oriented quantity
			return new Size(totalSize.Width, totalSize.Height);
		}