using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; namespace Tango.Graphics2D { public class Drawing2DStackPanel : Drawing2DHost { private double _currentPosition = 0; private double _maxPosition = 0; public Orientation Orientation { get { return (Orientation)GetValue(OrientationProperty); } set { SetValue(OrientationProperty, value); } } public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register("Orientation", typeof(Orientation), typeof(Drawing2DStackPanel), new PropertyMetadata(Orientation.Vertical)); public override Point GetElementLocation(FrameworkElement element) { if (Orientation == Orientation.Vertical) { _currentPosition += element.Margin.Top; Point location = new Point(0, 0); if (element.HorizontalAlignment == HorizontalAlignment.Left) { location = new Point(element.Margin.Left, _currentPosition); } else if (element.HorizontalAlignment == HorizontalAlignment.Right) { location = new Point(ActualWidth - element.Width - element.Margin.Right, _currentPosition); } else { location = new Point((ActualWidth / 2) - (element.Width / 2) + element.Margin.Left - element.Margin.Right, _currentPosition); } _currentPosition += (element.Height + element.Margin.Bottom); _maxPosition = Math.Max(_maxPosition, element.Width); return location; } else { _currentPosition += element.Margin.Left; Point location = new Point(0, 0); if (element.VerticalAlignment == VerticalAlignment.Top) { location = new Point(_currentPosition, element.Margin.Top); } else if (element.VerticalAlignment == VerticalAlignment.Bottom) { location = new Point(_currentPosition, ActualHeight - element.Height - element.Margin.Bottom); } else { location = new Point(_currentPosition, (ActualHeight / 2) - (element.Height / 2) + element.Margin.Top - element.Margin.Bottom); } _currentPosition += (element.Width + element.Margin.Right); _maxPosition = Math.Max(_maxPosition, element.Height); return location; } } protected override Size OnMeasure() { if (Orientation == Orientation.Vertical) { return new Size(HorizontalAlignment != HorizontalAlignment.Stretch ? _maxPosition : double.NaN, _currentPosition); } else { return new Size(_currentPosition, _maxPosition); } } public override Size GetElementSize(FrameworkElement element) { double width = element.Width; double height = element.Height; if (double.IsNaN(width) && Orientation == Orientation.Vertical) { width = ActualWidth; } if (double.IsNaN(height) && Orientation == Orientation.Horizontal) { height = ActualHeight; } width -= (element.Margin.Left + element.Margin.Right); height -= (element.Margin.Top + element.Margin.Bottom); return new Size(width, height); } } }