2017-03-09 19 views
1
for(int i = 0; i < stackPanel.Children.Count; i++) 
{ 
    stackPanel.Children.Remove(stackPanel.Children[i]); 
} 
int x = stackPanel.Children.Count(); 

上記のコードを実行した後。コントロールは画面上に表示されます。それでxは33になります。どうして私は本当に子供を取り除くのですか?StackPanelから子を削除する

+1

'stackPanel.Childrenを試してください。クリア() ' –

答えて

1

を、それが確実にその動作を説明する気にしないで、あなたのコードがやっている内容を正確に把握することは不可能です。

しかし、ここではいくつかの観測されている:あなたが投稿コードに基づいて

  1. 、私はいくつかの子供が削除であることを期待します。しかし、あなたが削除する子供を識別するために使用されるインデックスを変更すると同時に子供を削除するので、あなたは子供の半数をスキップしています。例えば。 iが0の場合は、最初の子を削除します。しかし、そうすることで、2番目の子供は今や最初の子供になります。その後、インクリメントi。だから次回はループを通って、もともと2番目の子を削除しないで、もともと3番目の子を削除します。等々。

    最後にインデックスを開始し、逆方向に作業することで、この問題に対処できます。または、コレクションが空になるまで、インデックス0で最初の子を常に削除するだけです。どちらの方法でも、RemoveAt()メソッドを使用すると効率を向上させることができます。このメソッドは、要素を見つけるまでコレクションを検索するのではなく、特定のインデックスの要素を削除します。

    もちろん、Clear()メソッドもあります。したがって、一度にすべての要素を削除したい場合は、ループを自分で記述するのではなく、その要素を使用することができます。
  2. 最初は自分でUIElementCollectionを操作してはいけません。このような動的要素がある場合は、代わりにStackPanelの各要素を表すビューモデルクラスを作成し、そのクラスのインスタンスを作成し、たとえば、 ObservableCollection<T>とし、そのコレクションをItemsControlItemsSourceにバインドします。これはStackPanelItemsPanel(デフォルトではItemsControl)としています。

    これを実行したら、必要に応じてコレクションを操作して要素を追加/削除/再配置します。もちろん、あなたがここで行った間違いを避ける方法でそうします。 :)
+0

あなたの100%正しい。時には、私は他の選択肢を認識していないので、正しい方法でやりません。私はあなたの2番目のポイントに従います。ありがとうございました –

1

stackPanel.ChildrenはあなたがちょうどこのようClear()使用することができますUIElementCollectionを返します:良いMinimal, Complete, and Verifiable code exampleなければ

stackPanel.Children.Clear() 
+0

どのように私はそれを逃しました!どうもありがとうございます。 –

+0

回答としてマークしましたが、私のポイントは低いので公開していません。 –

+0

心配しないで、嬉しくて助けました! –

0

なぜそれらを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()メソッドを呼び出すことができます。これは動作します。

関連する問題