예제 #1
0
        protected override Size MeasureOverride(Size availableSize)
        {
            bool isFirst = true;

            foreach (var child in Children)
            {
                PanelContentDirection direction = GetDirection(child);
                int         size        = GetSize(child);
                int         position    = GetPosition(child);
                Orientation orientation = GetOrientation(child);
                bool        snapToLines = GetSnapToLines(child);
                //int? linePosition = GetLinePosition(child);
                PanelContentAlignment alignment = GetAlignment(child);

                bool isHorizontal = orientation == Orientation.Horizontal;
                bool ltr          = direction == PanelContentDirection.LeftToRight;

                if (isFirst)
                {
                    child.Measure(new Size(double.MaxValue, double.MaxValue));
                    lineSize = isHorizontal ? child.DesiredSize.Height : child.DesiredSize.Width;
                    isFirst  = false;
                }

                int maxSize    = GetMaxSize(alignment, position, ltr);
                int actualSize = Math.Min(size, maxSize);

                int directionalPosition = GetPosition(ltr, isHorizontal, alignment, actualSize, position);
                //int orthagonalPosition = snapToLines ? 0 : linePosition.GetValueOrDefault(0);

                if (snapToLines)
                {
                    int maxPosition = isHorizontal ? (int)PaddingPercent.Left : (int)PaddingPercent.Top;
                    directionalPosition = Math.Max(directionalPosition, maxPosition);
                    int maxActualSize = 100 - (isHorizontal ? (int)PaddingPercent.Right : (int)PaddingPercent.Bottom) - directionalPosition;
                    actualSize = Math.Min(actualSize, maxActualSize);
                }
                //int x = isHorizontal ? directionalPosition : orthagonalPosition;
                //int y = !isHorizontal ? directionalPosition : orthagonalPosition;

                if (isHorizontal)
                {
                    double width = availableSize.Width * actualSize / 100;
                    child.Measure(new Size(width, double.MaxValue));
                }
                else
                {
                    double height = availableSize.Height * actualSize / 100;
                    child.Measure(new Size(double.MaxValue, height));
                }
            }
            return(base.MeasureOverride(availableSize));
        }
예제 #2
0
        private static int GetPosition(bool ltr, bool isHorizontal, PanelContentAlignment alignment, int length, int position)
        {
            int result = 0;

            if (isHorizontal && ltr && (alignment == PanelContentAlignment.Start || alignment == PanelContentAlignment.Left))
            {
                result = position;
            }
            else if (isHorizontal && !ltr && (alignment == PanelContentAlignment.End || alignment == PanelContentAlignment.Left))
            {
                result = 100 - position;
            }
            else if (isHorizontal && ltr && (alignment == PanelContentAlignment.End || alignment == PanelContentAlignment.Right))
            {
                result = position - length;
            }
            else if (isHorizontal && !ltr && (alignment == PanelContentAlignment.Start || alignment == PanelContentAlignment.Right))
            {
                result = (100 - position) - length;
            }
            else if (!isHorizontal && (alignment == PanelContentAlignment.Start || alignment == PanelContentAlignment.Left))
            {
                result = position;
            }
            else if (!isHorizontal && (alignment == PanelContentAlignment.End || alignment == PanelContentAlignment.Right))
            {
                result = position - length;
            }
            else if (isHorizontal && alignment == PanelContentAlignment.Middle && ltr)
            {
                result = position - length / 2;
            }
            else if (isHorizontal && alignment == PanelContentAlignment.Middle && !ltr)
            {
                result = (100 - position) - length / 2;
            }
            else if (!isHorizontal && alignment == PanelContentAlignment.Middle)
            {
                result = position - length / 2;
            }
            return(result);
        }
예제 #3
0
 private static int GetMaxSize(PanelContentAlignment alignment, int position, bool ltr)
 {
     if (alignment == PanelContentAlignment.Middle)
     {
         //If the text track cue alignment is middle, the text track cue text position is less than or equal to 50
         //Let maximum size be the text track cue text position multiplied by two.
         //If the text track cue alignment is middle, the text track cue text position is greater than  50
         //Let maximum size be the result of subtracting text track cue text position from 100 and then multiplying the result by two.
         return(position <= 50 ? position * 2 : (100 - position) * 2);
     }
     else if (
         (alignment == PanelContentAlignment.Start && ltr) ||
         (alignment == PanelContentAlignment.End && !ltr) ||
         (alignment == PanelContentAlignment.Left))
     {
         return(100 - position);
     }
     else
     {
         return(position);
     }
 }
예제 #4
0
 public static void SetAlignment(DependencyObject obj, PanelContentAlignment value)
 {
     obj.SetValue(AlignmentProperty, value);
 }
예제 #5
0
        protected override Size ArrangeOverride(Size finalSize)
        {
            double topEdge    = finalSize.Height * PaddingPercent.Top / 100;
            double bottomEdge = finalSize.Height - finalSize.Height * PaddingPercent.Bottom / 100;
            double leftEdge   = finalSize.Width * PaddingPercent.Left / 100;
            double rightEdge  = finalSize.Width - finalSize.Width * PaddingPercent.Right / 100;

            double stackingHeight   = bottomEdge;
            double stackingRtlWidth = rightEdge;
            double stackingLtrWidth = leftEdge;

            foreach (var child in Children)
            {
                PanelContentDirection direction    = GetDirection(child);
                int                   size         = GetSize(child);
                int                   position     = GetPosition(child);
                Orientation           orientation  = GetOrientation(child);
                bool                  snapToLines  = GetSnapToLines(child);
                int?                  linePosition = GetLinePosition(child);
                PanelContentAlignment alignment    = GetAlignment(child);

                bool isHorizontal = orientation == Orientation.Horizontal;
                bool ltr          = direction == PanelContentDirection.LeftToRight;

                int maxSize    = GetMaxSize(alignment, position, ltr);
                int actualSize = Math.Min(size, maxSize);

                int directionalPosition = GetPosition(ltr, isHorizontal, alignment, actualSize, position);
                int orthagonalPosition  = snapToLines ? 0 : linePosition.GetValueOrDefault(0);

                if (snapToLines)
                {
                    int maxPosition = isHorizontal ? (int)PaddingPercent.Left : (int)PaddingPercent.Top;
                    directionalPosition = Math.Max(directionalPosition, maxPosition);
                    int maxActualSize = 100 - (isHorizontal ? (int)PaddingPercent.Right : (int)PaddingPercent.Bottom) - directionalPosition;
                    actualSize = Math.Min(actualSize, maxActualSize);
                }

                int x = isHorizontal ? directionalPosition : orthagonalPosition;
                int y = !isHorizontal ? directionalPosition : orthagonalPosition;

                double left = finalSize.Width * x / 100;
                double top = finalSize.Height * y / 100;
                double width, height;

                if (isHorizontal)
                {
                    width  = finalSize.Width * actualSize / 100;
                    height = Math.Min(finalSize.Height, child.DesiredSize.Height);
                }
                else
                {
                    height = finalSize.Height * actualSize / 100;
                    width  = Math.Min(finalSize.Width, child.DesiredSize.Width);
                }

                if (snapToLines)
                {
                    if (!linePosition.HasValue)
                    {
                        if (isHorizontal)
                        {
                            top            = stackingHeight - height;
                            stackingHeight = top;
                        }
                        else if (ltr)
                        {
                            left             = stackingLtrWidth;
                            stackingLtrWidth = left + width;
                        }
                        else
                        {
                            left             = stackingRtlWidth - width;
                            stackingRtlWidth = left;
                        }
                    }
                    else if (linePosition.Value >= 0)
                    {
                        if (isHorizontal)
                        {
                            top = lineSize * linePosition.Value + topEdge;
                        }
                        else if (ltr)
                        {
                            left = lineSize * linePosition.Value + leftEdge;
                        }
                        else
                        {
                            left = rightEdge - lineSize * (linePosition.Value + 1);
                        }
                    }
                    else // negative linePosition
                    {
                        if (isHorizontal)
                        {
                            top = bottomEdge + lineSize * linePosition.Value;
                        }
                        else if (ltr)
                        {
                            left = rightEdge - lineSize * (-linePosition.Value + 1);
                        }
                        else
                        {
                            left = lineSize * -linePosition.Value + leftEdge;
                        }
                    }
                }
                child.Arrange(new Rect(left, top, width, height));
            }
            return(base.ArrangeOverride(finalSize));
        }
 public static void SetAlignment(DependencyObject obj, PanelContentAlignment value)
 {
     obj.SetValue(AlignmentProperty, value);
 }
 private static int GetMaxSize(PanelContentAlignment alignment, int position, bool ltr)
 {
     if (alignment == PanelContentAlignment.Middle)
     {
         //If the text track cue alignment is middle, the text track cue text position is less than or equal to 50
         //Let maximum size be the text track cue text position multiplied by two.
         //If the text track cue alignment is middle, the text track cue text position is greater than  50
         //Let maximum size be the result of subtracting text track cue text position from 100 and then multiplying the result by two.
         return position <= 50 ? position * 2 : (100 - position) * 2;
     }
     else if (
         (alignment == PanelContentAlignment.Start && ltr) ||
         (alignment == PanelContentAlignment.End && !ltr) ||
         (alignment == PanelContentAlignment.Left))
     {
         return 100 - position;
     }
     else
     {
         return position;
     }
 }
 private static int GetPosition(bool ltr, bool isHorizontal, PanelContentAlignment alignment, int length, int position)
 {
     int result = 0;
     if (isHorizontal && ltr && (alignment == PanelContentAlignment.Start || alignment == PanelContentAlignment.Left))
     {
         result = position;
     }
     else if (isHorizontal && !ltr && (alignment == PanelContentAlignment.End || alignment == PanelContentAlignment.Left))
     {
         result = 100 - position;
     }
     else if (isHorizontal && ltr && (alignment == PanelContentAlignment.End || alignment == PanelContentAlignment.Right))
     {
         result = position - length;
     }
     else if (isHorizontal && !ltr && (alignment == PanelContentAlignment.Start|| alignment == PanelContentAlignment.Right))
     {
         result = (100 - position) - length;
     }
     else if (!isHorizontal && (alignment == PanelContentAlignment.Start || alignment == PanelContentAlignment.Left))
     {
         result = position;
     }
     else if (!isHorizontal && (alignment == PanelContentAlignment.End || alignment == PanelContentAlignment.Right))
     {
         result = position - length;
     }
     else if (isHorizontal && alignment == PanelContentAlignment.Middle && ltr)
     {
         result = position - length / 2;
     }
     else if (isHorizontal && alignment == PanelContentAlignment.Middle && !ltr)
     {
         result = (100 - position) - length / 2;
     }
     else if (!isHorizontal && alignment == PanelContentAlignment.Middle)
     {
         result = position - length / 2;
     }
     return result;
 }