aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.SharedUI/Controls/TableGrid.cs
blob: ac60c5cff2fd63cbd8871346645801840ff8dd88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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 { }
            }
        }
    }
}