Как добавить элемент управления wpf к определенной строке и ячейке сетки во время выполнения? - PullRequest
21 голосов
/ 20 августа 2011

У меня есть следующая сетка в моем 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) Мой класс Window не имеет этого свойства «Controls» или чего-либо еще. И 2) Это не поможет мне определить строку и столбец каждого элемента пользовательского интерфейса.

Теперь в XAML было бы легко указать строку и столбец примерно так:

 <Label Grid.Column="0" Grid.Row="0"/>

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

Ответы [ 2 ]

31 голосов
/ 20 августа 2011

Свойства Grid.Row и Grid.Column имеют значение Прикрепленные свойства и поэтому не устанавливаются как обычные свойства .net. Правильный способ установить их из кода:

Grid.SetRow(someLabel, 0);
Grid.SetColumn(someLabel, 0);

Вы должны быть в состоянии сделать это до или после добавления их в коллекцию Children объекта Grid, но установка их перед добавлением элемента управления должна предотвращать любое возможное мерцание.

18 голосов
/ 20 августа 2011
  • Создайте сетку (<yourGrid>) и определения строк, как вы сделали.
  • Создайте элемент управления (<yourcontrol>).Затем установите ColumnSpan и Row для сетки:

    Grid.SetColumnSpan(<yourControl>, 3); Grid.SetRow(<yourControl>, 0);

  • Затем добавьте свой контроль в созданную вами сетку

    <yourGrid>.Children.Add(<yourControl>);

...