如果孩子是类型T,则仅从面板中移除孩子。

9

我有一个WPF Panel(比如Canvas),我想只删除它的Children,如果这些子元素是类型T,例如所有类型为Button的元素。

我该怎么做?我可以使用LINQ吗?

4个回答

12

你可以使用LINQ,这是一种方法。

canvas1.Children.OfType<Button>().ToList().ForEach(b => canvas1.Children.Remove(b));

或者您可以循环遍历所有子元素,如果它是按钮,则将它们添加到列表中,最后将它们删除。不要在foreach循环内部删除按钮。

List<Button> toRemove = new List<Button>();
foreach (var o in canvas1.Children)
{
    if (o is Button)
        toRemove.Add((Button)o);
}
for (int i = 0; i < toRemove.Count; i++)
{
    canvas1.Children.Remove(toRemove[i]);
}

LINQ的方式更易读、简单,而且编码量更少。


2
最后,简单而正确。谢谢!有关性能的一些注释? - Nick
@Nick,使用LINQ和普通方式不会有性能差异,我更喜欢使用LINQ。你可以根据自己的偏好决定使用哪种方式。 - Damith
2
请给出反对意见并留言,如果这里有什么错误。 - Damith

3

只需要进行类型比较。棘手的部分是在循环遍历集合时对其进行修改;我通过使用两个for循环来解决了这个问题:

var ToRemove = new List<UIElement>();
Type t = typeof(Button);
for (int i=0 ; i<MyPanel.Children.Count ; i++)
{
     if (MyPanel.Children[i].GetType()) == t)
         ToRemove.Add(MyPanel.Children[i]);
}
for (int i=0 ; i<ToRemove.Length ; i++) MyPanel.Children.Remove(ToRemove[i]);

编辑

这种方法更加清晰,从集合的末尾循环,以便在循环内删除项目。

Type t = typeof(Button);
for (int i=MyPanel.Children.Count-1 ; i>=0 ; i--)
{
     if (MyPanel.Children[i].GetType()) == t)
         MyPanel.Children.RemoveAt(i);
}

1
循环集合的 for 循环需要从 MyPanel.Children.Count - 1 开始,否则会抛出 IndexOutOfRangeException - Nikola Anusev

0

一些LINQ:

panel1.Controls.OfType<Button>().ToList().ForEach((b) => b.Parent = null);

对于所有的错误,我很抱歉。已经进行了更正并测试通过。


2
-1 panel.Controls?你测试过了吗?http://msdn.microsoft.com/zh-cn/library/system.windows.controls.panel - Nick
1
仍然错误。a) panel1.Control b) 惰性求值(Select 不会立即执行空赋值)。 - L.B
父级不是只读的,Panel.Controls 存在 - 它返回一个 ControlCollection。 - Dave New
@L.B:这是一个偏好的问题。但我同意,它有点复杂。 - Dave New
@davenewza 不是偏好问题。OP只是问“我可以使用LINQ吗”,而不是“如何在LINQ中实现”。 - L.B
显示剩余5条评论

0

这是我在手机上随手写的:

foreach(object o in MyPanel.Children)
{
    if(o.GetType() == typeof(Button))
    {
        MyPanel.Children.Remove(o);
    }
}

3
由于在使用 foreach 迭代集合时不能从中删除元素,所以这种方法行不通。 - Nikola Anusev
啊,他们什么时候会为iPhone开发VS,这样我就可以先测试我的代码了 =P - Jmyster

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