Как добавить управление wpf в определенную строку и ячейку сетки во время выполнения?
У меня есть следующая сетка в моем WPF "Окно" (да, окно класса);
<Grid Name="RequiredGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="70" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
</Grid>
В зависимости от того, что прошло в окне, я хочу добавить элементы в эту сетку по одной строке за раз. А именно, я хочу добавить метку в левом столбце и текстовое поле в правом столбце. Я считаю, что знаю, как добавить новые строки для хранения новых данных, выполнив следующее в коде:
RequiredGrid.RowDefinitions.Add(new RowDefinition());
Проблема в том, что после создания моей метки и моего текстового поля.
Label AttrLabel = new Label();
TextBox AttrTextBox = new TextBox();
Я не знаю, как получить его в окне, чтобы он отображался. Я видел некоторые потоки, которые говорят, что-то вроде этого:
this.Controls.Add(AttrLabel);
this.Controls.Add(AttrTextBox);
Есть две проблемы с этим. 1) Класс My Window не имеет этого свойства "Controls" или что-то еще. И 2) Это не поможет мне указать строку и столбец каждого элемента пользовательского интерфейса.
Теперь в XAML Id легко указать строку и столбец примерно так:
<Label Grid.Column="0" Grid.Row="0"/>
Таким образом, это поражает "динамичность" моего намерения. Кто-нибудь знает, как я могу заставить свои динамически созданные элементы пользовательского интерфейса отображать в моем окне и указать, какая строка и столбец будут отображаться в сетке.
Ответы
Ответ 1
Свойства Grid.Row и Grid.Column Attached Properties и как таковые не установлены как обычные .net-свойства. Правильный способ установить их из кода:
Grid.SetRow(someLabel, 0);
Grid.SetColumn(someLabel, 0);
Вы должны быть в состоянии сделать это до или после добавления их к коллекции объектов Grid Object, но установка их перед добавлением элемента управления должна предотвратить любое возможное мерцание.
Ответ 2
- Создайте сетку (
<yourGrid>
) и определения строк, как вы это сделали.
-
Создать элемент управления (<yourcontrol>
). Затем установите ColumnSpan и Row для сетки:
Grid.SetColumnSpan(<yourControl>, 3);
Grid.SetRow(<yourControl>, 0);
-
Затем добавьте свой элемент управления в созданную сетку
<yourGrid>.Children.Add(<yourControl>);