Попробуйте поместить document.getElementById
в setTimeout()
Например.
setTimeout(function(){
console.log(document.getElementById('whatever'));
}, 100);
Если это сработает, тогда это просто проблема синхронизации.
WPF использует броскую вещь, названную присоединенными свойствами. Таким образом в Вашем XAML Вы могли бы записать это:
<TextBlock Grid.Row="0" Grid.Column="0" />
И это эффективно переместит TextBlock в ячейку (0,0) из Вашей сетки.
В коде это выглядит немного странным. Я полагаю, что это было бы что-то как:
g.Children.Add(tb);
Grid.SetRow(tb, 0);
Grid.SetColumn(tb, 0);
Взгляните на ту ссылку выше - присоединенные свойства делают вещи действительно легкими сделать в XAML, возможно, за счет интуитивно выглядящего кода.
Местоположение ячейки является приложенным свойством - значение принадлежит TextBlock, а не Сетке. Однако, так как само свойство принадлежит Сетке, необходимо использовать или поле определения свойства или обеспеченные статические функции.
TextBlock tb = new TextBlock();
//
// Locate tb in the second row, third column.
// Row and column indices are zero-indexed, so this
// equates to row 1, column 2.
//
Grid.SetRow(tb, 1);
Grid.SetColumn(tb, 2);
Используйте присоединенные свойства класса Сетки.
в C#:
Grid.SetRow( cell, rownumber )
В XAML:
<TextBlock Grid.Row="1" />
Кроме того, я был бы совет, если Вы не используете динамические сетки, используйте язык разметки XAML. Я знаю, это имеет кривую обучения, но после того как Вы освоили его, настолько легче, особенно если Вы собираетесь использовать ControlTemplates и DataTemplates!;)