Fluent.MenuPanel.MeasureOverride C# (CSharp) Method

MeasureOverride() protected method

When overridden in a derived class, measures the size in layout required for child elements and determines a size for the System.Windows.FrameworkElement-derived class.
protected MeasureOverride ( System availableSize ) : Size
availableSize System The available size that this element can give to child elements. Infinity can be specified as a value /// to indicate that the element will size to whatever content is available.
return System.Windows.Size
        protected override System.Windows.Size MeasureOverride(System.Windows.Size availableSize)
        {
            double totalHeight = 0;
            double maxWidth = 0;
            if (!double.IsPositiveInfinity(availableSize.Width)) maxWidth = availableSize.Width;
            List<UIElement> nonItemsElements = new List<UIElement>();
            foreach (object child in InternalChildren)
            {
                MenuItem item = child as MenuItem;
                if((item!=null)&&(item.Visibility!=Visibility.Collapsed))
                {
                    item.Measure(availableSize);
                    totalHeight += item.DesiredSize.Height;
                    maxWidth = Math.Max(maxWidth, item.DesiredSize.Width);
                }
                else
                {
                    Separator separator = child as Separator;
                    
                    if ((separator!=null)&&(separator.Visibility!=Visibility.Collapsed))
                    {
                        separator.Measure(availableSize);
                        totalHeight += separator.DesiredSize.Height;
                        maxWidth = Math.Max(maxWidth, separator.DesiredSize.Width);
                    }
                    else
                    {
                        UIElement uiElement = child as UIElement;
                        if (uiElement != null)
                        {
                            nonItemsElements.Add(uiElement);
                        }
                    }
                }
            }

            if ((!double.IsPositiveInfinity(availableSize.Height)))
            {
                if (totalHeight < availableSize.Height)
                {
                    double deltaHeight = (availableSize.Height - totalHeight)/nonItemsElements.Count;
                    foreach (FrameworkElement item in nonItemsElements)
                    {
                        if (item.Visibility != Visibility.Collapsed)
                        {
                            item.Measure(new Size(availableSize.Width, deltaHeight));
                            maxWidth = Math.Max(maxWidth, Math.Max(item.DesiredSize.Width, (item).MinWidth));
                            totalHeight += Math.Max(item.DesiredSize.Height, (item).MinHeight);
                        }
                    }
                }
                else
                {
                    foreach (FrameworkElement item in nonItemsElements)
                    {
                        if (item.Visibility != Visibility.Collapsed)
                        {
                            item.Measure(new Size());
                            maxWidth = Math.Max(maxWidth, Math.Max(item.DesiredSize.Width, item.MinWidth));
                            totalHeight += Math.Max(item.DesiredSize.Height, item.MinHeight);
                        }
                    }
                }
            }
            else
            {
                foreach (FrameworkElement item in nonItemsElements)
                {
                    if (item.Visibility != Visibility.Collapsed)
                    {
                        item.Measure(availableSize);
                        maxWidth = Math.Max(maxWidth, Math.Max(item.DesiredSize.Width, item.MinWidth));
                        totalHeight += Math.Max(item.DesiredSize.Height, item.MinHeight);
                    }
                }
            }
            if (maxWidth < ResizeMinWidth) maxWidth = ResizeMinWidth;
            if (maxWidth > availableSize.Width) maxWidth = availableSize.Width;
            if (totalHeight < ResizeMinHeight) totalHeight = ResizeMinHeight;
            return new Size(maxWidth,totalHeight);
        }