for(int i = 0; i < stackPanel.Children.Count; i++)
{
stackPanel.Children.Remove(stackPanel.Children[i]);
}
int x = stackPanel.Children.Count();
上記のコードを実行した後。コントロールは画面上に表示されます。それでxは33になります。どうして私は本当に子供を取り除くのですか?StackPanelから子を削除する
for(int i = 0; i < stackPanel.Children.Count; i++)
{
stackPanel.Children.Remove(stackPanel.Children[i]);
}
int x = stackPanel.Children.Count();
上記のコードを実行した後。コントロールは画面上に表示されます。それでxは33になります。どうして私は本当に子供を取り除くのですか?StackPanelから子を削除する
を、それが確実にその動作を説明する気にしないで、あなたのコードがやっている内容を正確に把握することは不可能です。
しかし、ここではいくつかの観測されている:あなたが投稿コードに基づいて
i
が0の場合は、最初の子を削除します。しかし、そうすることで、2番目の子供は今や最初の子供になります。その後、インクリメントi
。だから次回はループを通って、もともと2番目の子を削除しないで、もともと3番目の子を削除します。等々。 0
で最初の子を常に削除するだけです。どちらの方法でも、RemoveAt()
メソッドを使用すると効率を向上させることができます。このメソッドは、要素を見つけるまでコレクションを検索するのではなく、特定のインデックスの要素を削除します。 Clear()
メソッドもあります。したがって、一度にすべての要素を削除したい場合は、ループを自分で記述するのではなく、その要素を使用することができます。UIElementCollection
を操作してはいけません。このような動的要素がある場合は、代わりにStackPanel
の各要素を表すビューモデルクラスを作成し、そのクラスのインスタンスを作成し、たとえば、 ObservableCollection<T>
とし、そのコレクションをItemsControl
のItemsSource
にバインドします。これはStackPanel
をItemsPanel
(デフォルトではItemsControl
)としています。 あなたの100%正しい。時には、私は他の選択肢を認識していないので、正しい方法でやりません。私はあなたの2番目のポイントに従います。ありがとうございました –
stackPanel.Children
はあなたがちょうどこのようClear()
使用することができますUIElementCollectionを返します:良いMinimal, Complete, and Verifiable code exampleなければ
stackPanel.Children.Clear()
どのように私はそれを逃しました!どうもありがとうございます。 –
回答としてマークしましたが、私のポイントは低いので公開していません。 –
心配しないで、嬉しくて助けました! –
なぜそれらを1つずつ削除できないのか説明できますか?
繰り返しを繰り返す同じコレクションを変更するためです。したがって、インデックス0の要素を削除してループ変数を1に増やすと、削除されないインデックス0に新しい項目が追加されます。
これを逆に繰り返して解決できます。
for (int i = stackPanel.Children.Count - 1; i >= 0; i--)
{
stackPanel.Children.Remove(stackPanel.Children[i]);
}
int x = stackPanel.Children.Count;
それとも@StanleySにより示唆されるように、あなただけのstackPanel.Clear()
メソッドを呼び出すことができます。これは動作します。
'stackPanel.Childrenを試してください。クリア() ' –