using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace Tango.SharedUI.Controls { public class TableGrid : Grid { public GridLength RowHeight { get { return (GridLength)GetValue(RowHeightProperty); } set { SetValue(RowHeightProperty, value); } } public static readonly DependencyProperty RowHeightProperty = DependencyProperty.Register("RowHeight", typeof(GridLength), typeof(TableGrid), new FrameworkPropertyMetadata(new GridLength(1, GridUnitType.Star), FrameworkPropertyMetadataOptions.AffectsRender)); public Thickness SecondRowMargin { get { return (Thickness)GetValue(SecondRowMarginProperty); } set { SetValue(SecondRowMarginProperty, value); } } // Using a DependencyProperty as the backing store for SecondRowMargin. This enables animation, styling, binding, etc... public static readonly DependencyProperty SecondRowMarginProperty = DependencyProperty.Register("SecondRowMargin", typeof(Thickness), typeof(TableGrid), new PropertyMetadata(new Thickness(20, 0, 0, 0))); public bool MakeFirstColumnVerticalAlignmentBottom { get { return (bool)GetValue(MakeFirstColumnVerticalAlignmentBottomProperty); } set { SetValue(MakeFirstColumnVerticalAlignmentBottomProperty, value); } } public static readonly DependencyProperty MakeFirstColumnVerticalAlignmentBottomProperty = DependencyProperty.Register("MakeFirstColumnVerticalAlignmentBottom", typeof(bool), typeof(TableGrid), new PropertyMetadata(true)); public TableGrid() { ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) }); ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) }); this.Loaded += TableGrid_Loaded; } private void TableGrid_Loaded(object sender, RoutedEventArgs e) { InvalidateGrid(); } protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved) { base.OnVisualChildrenChanged(visualAdded, visualRemoved); InvalidateGrid(); } protected override Size ArrangeOverride(Size arrangeSize) { return base.ArrangeOverride(arrangeSize); } private void InvalidateGrid() { RowDefinitions.Clear(); RowDefinitions.Add(new RowDefinition() { Height = RowHeight }); int currentRow = 0; for (int i = 0; i < Children.Count; i++) { try { SetRow(Children[i], currentRow); if (i % 2 != 0) { SetColumn(Children[i], 1); if ((Children[i] as FrameworkElement).Margin == new Thickness()) { (Children[i] as FrameworkElement).Margin = SecondRowMargin; } currentRow++; RowDefinitions.Add(new RowDefinition() { Height = RowHeight }); } if (MakeFirstColumnVerticalAlignmentBottom) { (Children[i] as FrameworkElement).VerticalAlignment = VerticalAlignment.Bottom; } } catch { } } } } }