如何在WPF中移除动态添加的控件

5

我无法在按钮单击事件中删除动态添加的控件。请告诉我该如何操作。

public void populateform(ArrayList list)
{
  int i = 1;
  int count = 0;

  foreach (string cartitems in list)
  {
    Label lbl = new Label();
    lbl.Name = "myLabel"+i;

    lbl.Content = cartitems.ToString();
    mystackpanel.Children.Add(lbl);
    i++;
    ++count;
    if (count % 3 == 0)
    {
      Button btndelete = new Button();
      btndelete.Content = "Delete";

      btndelete.Width = 120;
      btndelete.Height = 35;
      btndelete.Click += new RoutedEventHandler(btndelete_Click);

      mystackpanel.Children.Add(btndelete);                    
    }
  }
}

private void btndelete_Click(object sender, RoutedEventArgs e)
{
  Label lbl2 = (Label)this.mystackpanel.FindName("myLabel2");
  this.mystackpanel.Children.Remove(lbl2);               
}

1
不要在 WPF 的过程式代码中创建或操作 UI 元素,这就是 XAML 的作用。发布您所需的屏幕截图,以便我们可以告诉您在 WPF 中正确的操作方式。 - Federico Berasategui
2
@HighCore 这不是真的。创建元素是完全可以接受的,但我绝对同意绑定列表是更好的方法。 - AlSki
1
@alski "完全可以接受"?在什么情况下?为什么你会选择一个糟糕的过程式方法而不是正确的方法?拜托了。 - Federico Berasategui
2
@Highcore,这个代码片段完全可以通过编译和运行,并且MSDN文档中也明确说明了可以这样实现。从上面代码片段的其他部分可以看出,它很可能适合user2613455的知识水平,因此我们不会一下子淹没他们过多的知识。 - AlSki
2
@Alski 我不同意。在任何情况下,教授糟糕的实践(顺便说一下,这需要更多的代码)而不是正确的方法都是不必要的,无论个人的知识水平如何。使用 ItemsControl 方法更加简洁,并且可以从一开始就教授 WPF 思维方式。 - Federico Berasategui
显示剩余2条评论
2个回答

9

FindName的备注部分如下:

WPF XAML Namescopes中有详细说明,FindName在当前元素的名称范围内运行。

简而言之,您必须调用RegisterName才能使动态创建的元素工作时使用FindName

lbl.Name = "myLabel" + i;
lbl.Content = cartitems;
mystackpanel.Children.Add(lbl);
mystackpanel.RegisterName(lbl.Name, lbl); // here

然而,通过名称查找元素可能会更容易,如下所示,无需使用FindName

var element = mystackpanel.Children
    .OfType<FrameworkElement>()
    .FirstOrDefault(e => e.Name == "myLabel2")

4
Label lbl = (Label)LogicalTreeHelper.FindLogicalNode(mystackpanel, "myLabelx");
mystackpanel.Children.Remove(lbl);

在我的画布元素上运行良好。+1 - BENN1TH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接