private static Rectangle GetGrowthBounds(IArrangedElement element, Size newSize) { GrowthDirection direction = GetGrowthDirection(element); Rectangle oldBounds = GetCachedBounds(element); Point location = oldBounds.Location; Debug.Assert((CommonProperties.GetAutoSizeMode(element) == AutoSizeMode.GrowAndShrink || (newSize.Height >= oldBounds.Height && newSize.Width >= oldBounds.Width)), "newSize expected to be >= current size."); if ((direction & GrowthDirection.Left) != GrowthDirection.None) { // We are growing towards the left, translate X location.X -= newSize.Width - oldBounds.Width; } if ((direction & GrowthDirection.Upward) != GrowthDirection.None) { // We are growing towards the top, translate Y location.Y -= newSize.Height - oldBounds.Height; } Rectangle newBounds = new Rectangle(location, newSize); Debug.Assert((CommonProperties.GetAutoSizeMode(element) == AutoSizeMode.GrowAndShrink || newBounds.Contains(oldBounds)), "How did we resize in such a way we no longer contain our old bounds?"); return(newBounds); }
private static void LayoutAutoSizedControls(IArrangedElement container) { ArrangedElementCollection children = container.Children; for (int i = children.Count - 1; i >= 0; i--) { IArrangedElement element = children[i]; if (CommonProperties.xGetAutoSizedAndAnchored(element)) { Rectangle bounds = GetCachedBounds(element); AnchorStyles anchor = GetAnchor(element); Size proposedConstraints = LayoutUtils.MaxSize; if ((anchor & (AnchorStyles.Left | AnchorStyles.Right)) == (AnchorStyles.Left | AnchorStyles.Right)) { proposedConstraints.Width = bounds.Width; } if ((anchor & (AnchorStyles.Top | AnchorStyles.Bottom)) == (AnchorStyles.Top | AnchorStyles.Bottom)) { proposedConstraints.Height = bounds.Height; } Size prefSize = element.GetPreferredSize(proposedConstraints); Rectangle newBounds = bounds; if (CommonProperties.GetAutoSizeMode(element) == AutoSizeMode.GrowAndShrink) { // this is the case for simple things like radio button, checkbox, etc. newBounds = GetGrowthBounds(element, prefSize); } else { // we had whacked this check, but it turns out it causes undesirable // behavior in things like panel. a panel with no elements sizes to 0,0. if (bounds.Width < prefSize.Width || bounds.Height < prefSize.Height) { Size newSize = LayoutUtils.UnionSizes(bounds.Size, prefSize); newBounds = GetGrowthBounds(element, newSize); } } if (newBounds != bounds) { SetCachedBounds(element, newBounds); } } } }
private static void LayoutAutoSizedControls(IArrangedElement container) { ArrangedElementCollection children = container.Children; for (int i = children.Count - 1; i >= 0; i--) { IArrangedElement element = children[i]; if (CommonProperties.xGetAutoSizedAndAnchored(element)) { Rectangle cachedBounds = GetCachedBounds(element); AnchorStyles anchor = GetAnchor(element); Size preferredSize = element.DisplayRectangle.Size; //Size maxSize = cachedBounds.Size; if ((anchor & (AnchorStyles.Right | AnchorStyles.Left)) == (AnchorStyles.Right | AnchorStyles.Left)) { preferredSize.Width = cachedBounds.Width; } if ((anchor & (AnchorStyles.Bottom | AnchorStyles.Top)) == (AnchorStyles.Bottom | AnchorStyles.Top)) { preferredSize.Height = cachedBounds.Height; } Rectangle bounds = cachedBounds; if (CommonProperties.GetAutoSizeMode(element) == AutoSizeMode.GrowAndShrink) { bounds = GetGrowthBounds(element, preferredSize); } else if ((cachedBounds.Width < preferredSize.Width) || (cachedBounds.Height < preferredSize.Height)) { Size newSize = LayoutUtils.UnionSizes(cachedBounds.Size, preferredSize); bounds = GetGrowthBounds(element, newSize); } if (bounds != cachedBounds) { SetCachedBounds(element, bounds); } } } }