Прежде всего, вы можете использовать простую сетку. И иметь ссылку на любую ячейку сетки с помощью методов Grid.SetColumn и Grid.SetRow.
Смотрите ссылки:
http://msdn.microsoft.com/en-us/library/system.windows.controls.grid.setcolumn.aspx
http://msdn.microsoft.com/en-us/library/system.windows.controls.grid.setrow.aspx
Короткий и быстрый пример:
XAML:
<Grid Height="Auto" Name="Mygrid" Width="Auto" />
C #:
string[] _names = new string[] { "first", "second", "three" };
Mygrid.ShowGridLines = true;
Mygrid.RowDefinitions.Clear();
Mygrid.ColumnDefinitions.Clear();
int rows = 3;
int cols = 3;
for (int r = 0; r < rows; r++)
Mygrid.RowDefinitions.Add(new RowDefinition());
for (int c = 0; c < cols; c++)
Mygrid.ColumnDefinitions.Add(new ColumnDefinition());
for (int c = 0; c < Mygrid.ColumnDefinitions.Count; c++)
{
int rowIndex = 0;
foreach (string s in _names)
{
var someControll = new TextBox();
someControll.Text = string.Format("{0} row in {1} column", s,c);
someControll.Height = 25;
Mygrid.Children.Add(someControll);
Grid.SetRow(someControll, rowIndex);
Grid.SetColumn(someControll, c);
rowIndex += 1;
}
}