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 { }
}
}
}
}
|