9

我有一个 WPF PanelCanvas例如),并且Children仅当这些子项为 type时,我才想将其删除T,例如所有 type Button

我怎样才能做到这一点?我可以使用 LINQ 吗?

4

4 回答 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 方式更易读,更简单,编码更少。

于 2012-06-22T17:48:41.747 回答
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);
}
于 2012-06-22T17:29:14.440 回答
0

一些LINQ:

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

对不起,伙计们所有的错误。进行了修正并进行了测试。

于 2012-06-22T17:28:59.790 回答
0

把这个从我的手机上取下来:

foreach(object o in MyPanel.Children)
{
    if(o.GetType() == typeof(Button))
    {
        MyPanel.Children.Remove(o);
    }
}
于 2012-06-22T17:38:05.947 回答