【问题标题】:Programaticly add multiple labels to WPF grid以编程方式将多个标签添加到 WPF 网格
【发布时间】:2019-03-01 17:42:34
【问题描述】:

我的旧 Winform 示例:

我有一个空白网格,我需要在 foreach 中添加一些动态生成的标签

我正在使用它来创建标签并将名称设置为我以后需要使用的 id。

this.LayoutRoot.Children.Add(new Label { Foreground = Brushes.White, HorizontalContentAlignment = System.Windows.HorizontalAlignment.Center, Background = Brushes.LightBlue, Content = Node.name, Height = 20, Width = 320, Name = "_" + Node.id});

我试过了

Grid.SetRow 

然后是新标签,但它需要一个 UI 元素传递给它,并且标签尚未创建...

所以目前的代码只是在网格中心将所有标签叠加在一起。

也试过

Grid.SetRow("_" + Node.id, i); 

但不支持名称字符串格式,也许还有另一种方法来创建和定位标签

谢谢

【问题讨论】:

  • 您没有提供您的实现范围,所以这只是一个猜测:也许MVVM 模式将是您要求的完美解决方案。你可以先学习模式的原理,也可以看看实际的例子,从 e 开始。 G。在这里:wpf-tutorial.com/list-controls/itemscontrol 了解此解决方案是否符合您的需求。
  • 那就不要使用网格了!使用 StackPanel!
  • 你走错路了。 WPF 不打算这样使用。 WPF 不是 WinForms。不要在代码中构建你的 UI。相反,请使用强大的样式和模板机制以及数据绑定。
  • @dymanoid 您可以使用从 api 调用返回的数据而不是通过代码在计时器(30 秒)上删除/添加控件吗?谢谢
  • @DwayneDibbley,是的,你可以。有关详细信息,请参阅 MVVM。

标签: c# wpf


【解决方案1】:

这应该可以为您解决问题! 您可以使用.SetValue() 方法。

        for (int i = 0; i < 5; i++)
        {
            Label lbl = new Label { Foreground = Brushes.White, HorizontalContentAlignment = System.Windows.HorizontalAlignment.Center, Background = Brushes.LightBlue, Content = "name" + i, Height = 20, Width = 320, Name = "_" + i };
            lbl.SetValue(Grid.RowProperty, i);
            this.LayoutRoot.Children.Add(lbl);

        }

这假设您的网格看起来像这样:

<Grid Name="LayoutRoot">
        <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.ColumnDefinitions>
</Grid>

但如果您只想将标签堆叠在一起,您应该使用 StackPanel 而不是网格!

编辑: 您更新了您的问题,您只需要做的就是将网格更改为堆栈面板,然后它们将自动堆叠。顺便说一句,您基本上是在这里构建一个 ListBox...为什么不首先使用 ListBox?

【讨论】:

  • 谢谢,StackPanel 是我在这个简单应用程序中需要的指针,我会在未来查看 MVVM 选项
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2011-05-02
相关资源
最近更新 更多