如何在运行时将wpf控件添加到特定网格行和单元格?

时间:2011-08-19 20:37:00

标签: wpf user-interface dynamic grid

我的WPF“Window”中有以下网格(是类窗口);

<Grid Name="RequiredGrid">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="70" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
        </Grid>

根据传入窗口的内容,我想一次一行地将项目添加到此网格中。也就是说,我想在左列中添加一个Label,在右列中添加一个TextBox。我相信我知道如何通过在后面的代码中执行以下操作来添加新行来保存新数据:

RequiredGrid.RowDefinitions.Add(new RowDefinition());

问题是,在我创建了Label和TextBox之后。

Label AttrLabel = new Label();
TextBox AttrTextBox = new TextBox();

我真的不知道怎么把它放到窗口中以便显示出来。我见过一些帖子说,做这样的事情:

this.Controls.Add(AttrLabel);
this.Controls.Add(AttrTextBox);

这有两个问题。 1)我的Window类没有这个“Controls”属性或其他什么。 2)这无助于我指定每个UI项的行和列。

现在在XAML中,我很容易用这样的东西指定行和列:

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

虽然这打败了我的意图的“动态性”。有谁知道如何让我的动态创建的UI元素显示在我的窗口中,并指定它将显示在网格中的哪个行和列。

2 个答案:

答案 0 :(得分:30)

Grid.Row和Grid.Column属性为Attached Properties,因此不像普通的.net属性那样设置。从代码中设置它们的正确方法是:

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

您应该可以在将它们添加到Grid对象的Children集合之前或之后执行此操作,但在添加控件之前设置它们应该可以防止任何可能的闪烁。

答案 1 :(得分:18)

  • 像您一样创建网格(<yourGrid>)和行定义。
  • 创建控件(<yourcontrol>)。然后为网格设置ColumnSpan和Row:

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

  • 然后将您的控件添加到您创建的网格

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