#1,175 – Custom Panel, part VII (Using Attached Property to Arrange)
October 8, 2014 1 Comment
Here’s an example of a custom panel that uses an attached property (weight) in determining both size and position of child elements.
public class WeightedPanel : Panel { private static FrameworkPropertyMetadata weightMetadata = new FrameworkPropertyMetadata(1.0, FrameworkPropertyMetadataOptions.AffectsParentArrange); public static readonly DependencyProperty WeightProperty = DependencyProperty.RegisterAttached("Weight", typeof(double), typeof(WeightedPanel), weightMetadata); public static void SetWeight(DependencyObject depObj, double value) { depObj.SetValue(WeightProperty, value); } protected override Size MeasureOverride(Size availableSize) { double totalWeight = totalChildWeight(); foreach (UIElement elem in InternalChildren) { double childWeight = (double)elem.GetValue(WeightProperty); double childHeight = (childWeight / totalWeight) * availableSize.Height; elem.Measure(new Size(availableSize.Width, childHeight)); } return availableSize; } protected override Size ArrangeOverride(Size finalSize) { double totalWeight = totalChildWeight(); double top = 0.0; foreach (UIElement elem in InternalChildren) { double childWeight = (double)elem.GetValue(WeightProperty); double childHeight = (childWeight / totalWeight) * finalSize.Height; Rect r = new Rect(new Point(0.0, top), new Size(elem.DesiredSize.Width, childHeight)); elem.Arrange(r); top += childHeight; } return finalSize; } private double totalChildWeight() { double weightSum = 0; foreach (UIElement elem in InternalChildren) weightSum += (double)elem.GetValue(WeightProperty); return weightSum; } }
Below, we use this panel, specifying that 2nd label is 2x bigger (more weight) than the first label.
<loc:WeightedPanel> <Label Content="I'm child #1" loc:WeightedPanel.Weight="1" Background="Thistle" /> <Label Content="I'm child #2" loc:WeightedPanel.Weight="2" Background="Lavender" /> <!-- Weight defaults to 1 --> <Label Content="Third kid" Background="Honeydew" /> </loc:WeightedPanel>
Pingback: Dew Drop – October 8, 2014 (#1872) | Morning Dew