我有一个 WPF Panel
(Canvas
例如),并且Children
仅当这些子项为 type时,我才想将其删除T
,例如所有 type Button
。
我怎样才能做到这一点?我可以使用 LINQ 吗?
您可以使用 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 方式更易读,更简单,编码更少。
只需进行类型比较。棘手的部分是在循环时修改集合;我通过使用两个 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);
}
一些LINQ:
panel1.Controls.OfType<Button>().ToList().ForEach((b) => b.Parent = null);
对不起,伙计们所有的错误。进行了修正并进行了测试。
把这个从我的手机上取下来:
foreach(object o in MyPanel.Children)
{
if(o.GetType() == typeof(Button))
{
MyPanel.Children.Remove(o);
}
}