私は WPF を持っていますPanel
(Canvas
たとえば) 。Children
これらの子が type の場合にのみT
、たとえば all の typeの場合にのみ削除しButton
ます。
これどうやってするの?LINQ を使用できますか?
LINQ を使用できます。これは 1 つの方法です。
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 つの 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);
}
}