Подтвердить что ты не робот

Как добавить управление 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"/>

Таким образом, это поражает "динамичность" моего намерения. Кто-нибудь знает, как я могу заставить свои динамически созданные элементы пользовательского интерфейса отображать в моем окне и указать, какая строка и столбец будут отображаться в сетке.

4b9b3361

Ответ 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>);