示例#1
0
        /// <summary>
        /// Measure children sizes before arrange children position.
        /// </summary>
        /// <param name="availableSize"></param>
        /// <returns></returns>
        protected override Size MeasureOverride(Size constraint)
        {
            UIElementCollection internalChildren = this.InternalChildren;
            double val1_1 = 0.0;
            double val1_2 = 0.0;
            double val2_1 = 0.0;
            double val2_2 = 0.0;
            int    index  = 0;

            for (int count = internalChildren.Count; index < count; ++index)
            {
                UIElement element = internalChildren[index];
                if (element != null && element.Visibility != Visibility.Collapsed)
                {
                    Size availableSize = new Size(Math.Max(0.0, constraint.Width - val2_1), Math.Max(0.0, constraint.Height - val2_2));
                    element.Measure(availableSize);
                    Size desiredSize = element.DesiredSize;
                    switch (HierarchicalPanel.GetDock(element))
                    {
                    case Dock.Left:
                    case Dock.Right:
                        val1_2  = Math.Max(val1_2, val2_2 + desiredSize.Height);
                        val2_1 += desiredSize.Width;
                        continue;

                    case Dock.Top:
                    case Dock.Bottom:
                        val1_1  = Math.Max(val1_1, val2_1 + desiredSize.Width);
                        val2_2 += desiredSize.Height;
                        continue;

                    default:
                        continue;
                    }
                }
            }
            return(new Size(Math.Max(val1_1, val2_1), Math.Max(val1_2, val2_2)));
        }
示例#2
0
        /// <summary>
        /// Arrange children position after measure children size.
        /// </summary>
        /// <param name="finalSize"></param>
        /// <returns></returns>
        protected override Size ArrangeOverride(Size arrangeSize)
        {
            UIElementCollection internalChildren = this.InternalChildren;
            int count = internalChildren.Count;


            double width          = arrangeSize.Width;
            double height         = arrangeSize.Height;
            double highLevelCount = 0;

            for (int i = 0; i < count; i++)
            {
                UIElement element = InternalChildren[i];
                if (element != null && element.Visibility != Visibility.Collapsed)
                {
                    Size      desiredSize = element.DesiredSize;
                    DockLevel dockLevel   = HierarchicalPanel.GetDockLevel(element);
                    if (dockLevel == DockLevel.Low)
                    {
                        width  -= desiredSize.Width;
                        height -= desiredSize.Height;
                    }
                    else
                    {
                        highLevelCount++;
                    }
                }
            }

            double x    = 0.0;
            double y    = 0.0;
            double num2 = 0.0;
            double num3 = 0.0;

            for (int index = 0; index < count; ++index)
            {
                UIElement element = internalChildren[index];
                if (element != null && element.Visibility != Visibility.Collapsed)
                {
                    Size desiredSize = element.DesiredSize;
                    Rect finalRect   = new Rect(x, y, Math.Max(0.0, arrangeSize.Width - (x + num2)), Math.Max(0.0, arrangeSize.Height - (y + num3)));
                    if (HierarchicalPanel.GetDockLevel(element) == DockLevel.Low)
                    {
                        switch (DockPanel.GetDock(element))
                        {
                        case Dock.Left:
                            x += desiredSize.Width;
                            finalRect.Width = desiredSize.Width;
                            break;

                        case Dock.Top:
                            y += desiredSize.Height;
                            finalRect.Height = desiredSize.Height;
                            break;

                        case Dock.Right:
                            num2           += desiredSize.Width;
                            finalRect.X     = Math.Max(0.0, arrangeSize.Width - num2);
                            finalRect.Width = desiredSize.Width;
                            break;

                        case Dock.Bottom:
                            num3            += desiredSize.Height;
                            finalRect.Y      = Math.Max(0.0, arrangeSize.Height - num3);
                            finalRect.Height = desiredSize.Height;
                            break;
                        }
                    }
                    else
                    {
                        switch (DockPanel.GetDock(element))
                        {
                        case Dock.Left:
                            x += width / highLevelCount;
                            finalRect.Width = width / highLevelCount;
                            break;

                        case Dock.Top:
                            y += height / highLevelCount;
                            finalRect.Height = height / highLevelCount;
                            break;

                        case Dock.Right:
                            num2           += width / highLevelCount;
                            finalRect.X     = Math.Max(0.0, arrangeSize.Width - num2);
                            finalRect.Width = desiredSize.Width;
                            break;

                        case Dock.Bottom:
                            num3            += height / highLevelCount;
                            finalRect.Y      = Math.Max(0.0, arrangeSize.Height - num3);
                            finalRect.Height = desiredSize.Height;
                            break;
                        }
                    }
                    element.Arrange(finalRect);
                }
            }
            return(arrangeSize);
        }