diff --git a/src/Shared/HandyControl_Shared/Controls/Panel/SimpleStackPanel.cs b/src/Shared/HandyControl_Shared/Controls/Panel/SimpleStackPanel.cs new file mode 100644 index 00000000..6fa5f209 --- /dev/null +++ b/src/Shared/HandyControl_Shared/Controls/Panel/SimpleStackPanel.cs @@ -0,0 +1,101 @@ +using System; +using System.Windows; +using System.Windows.Controls; + +namespace HandyControl.Controls +{ + public class SimpleStackPanel : Panel + { + public static readonly DependencyProperty OrientationProperty = + StackPanel.OrientationProperty.AddOwner(typeof(SimpleStackPanel), + new FrameworkPropertyMetadata(Orientation.Vertical, FrameworkPropertyMetadataOptions.AffectsMeasure)); + + public Orientation Orientation + { + get => (Orientation) GetValue(OrientationProperty); + set => SetValue(OrientationProperty, value); + } + + protected override Size MeasureOverride(Size constraint) + { + var stackDesiredSize = new Size(); + var children = InternalChildren; + var layoutSlotSize = constraint; + + if (Orientation == Orientation.Horizontal) + { + layoutSlotSize.Width = double.PositiveInfinity; + + for (int i = 0, count = children.Count; i < count; ++i) + { + var child = children[i]; + if (child == null) continue; + + child.Measure(layoutSlotSize); + var childDesiredSize = child.DesiredSize; + + stackDesiredSize.Width += childDesiredSize.Width; + stackDesiredSize.Height = Math.Max(stackDesiredSize.Height, childDesiredSize.Height); + } + } + else + { + layoutSlotSize.Height = double.PositiveInfinity; + + for (int i = 0, count = children.Count; i < count; ++i) + { + var child = children[i]; + if (child == null) continue; + + child.Measure(layoutSlotSize); + var childDesiredSize = child.DesiredSize; + + stackDesiredSize.Width = Math.Max(stackDesiredSize.Width, childDesiredSize.Width); + stackDesiredSize.Height += childDesiredSize.Height; + } + } + + return stackDesiredSize; + } + + protected override Size ArrangeOverride(Size arrangeSize) + { + var children = InternalChildren; + var rcChild = new Rect(arrangeSize); + var previousChildSize = 0.0; + + if (Orientation == Orientation.Horizontal) + { + for (int i = 0, count = children.Count; i < count; ++i) + { + var child = children[i]; + if (child == null) continue; + + rcChild.X += previousChildSize; + previousChildSize = child.DesiredSize.Width; + rcChild.Width = previousChildSize; + rcChild.Height = Math.Max(arrangeSize.Height, child.DesiredSize.Height); + + child.Arrange(rcChild); + } + } + else + { + for (int i = 0, count = children.Count; i < count; ++i) + { + var child = children[i]; + if (child == null) continue; + + rcChild.Y += previousChildSize; + previousChildSize = child.DesiredSize.Height; + rcChild.Height = previousChildSize; + rcChild.Width = Math.Max(arrangeSize.Width, child.DesiredSize.Width); + + child.Arrange(rcChild); + } + } + + return arrangeSize; + } + } +} diff --git a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems index 894864b9..5bc91cfa 100644 --- a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems +++ b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems @@ -46,6 +46,7 @@ +