【问题标题】:How to add wpf control to particular grid row and cell during runtime?如何在运行时将 wpf 控件添加到特定的网格行和单元格?
【发布时间】:2011-08-19 20:37:00
【问题描述】:

我的 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 类没有这个“控件”属性或其他任何东西。并且 2) 这不会帮助我指定每个 UI 项的行和列。

现在在 XAML 中,我可以很容易地用这样的方式指定行和列:

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

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

【问题讨论】:

    标签: wpf user-interface dynamic grid


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,这很有效:D 我不熟悉“附加属性”以及它们在 c# 语法中的工作方式。此外,不知道在网格的子列表中弹出 UI 元素会为我显示在屏幕上。谢谢。
    【解决方案2】:
    • 像您所做的那样创建网格 (&lt;yourGrid&gt;) 和行定义。
    • 创建控件 (&lt;yourcontrol&gt;)。然后为网格设置 ColumnSpan 和 Row:

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

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

      &lt;yourGrid&gt;.Children.Add(&lt;yourControl&gt;);

    【讨论】:

    • 这也有效。我选择了 Grid.SetColumn 而不是 Grid.SetColumnSpan。
    • 这个有一些标记的答案被错过了!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 2017-07-07
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多