从StackPanel中删除子项
for(int i = 0; i < stackPanel.Children.Count; i++) { stackPanel.Children.Remove(stackPanel.Children[i]); } int x = stackPanel.Children.Count();
运行上面的代码后。 控件仍在屏幕上。 然后x等于33.那么我该如何真正删除孩子呢?
如果没有一个好的Minimal,Complete和Verifiable代码示例 ,就不可能确切地知道代码正在做什么,更不用说确定地解释它的行为。
但是,这里有一些观察:
- 根据您发布的代码,我希望有些孩子被删除。 但是因为你在删除孩子的同时你正在改变用于识别要移除的孩子的索引,所以你正在跳过一半的孩子。 例如,当
i
为0时,你删除了第一个孩子。 但这样做会导致第二个孩子成为第一个孩子。 然后你增加i
。 因此,下一次循环,你不删除最初的第二个孩子,你删除原来是第三个孩子。 等等。您可以通过在结尾处开始索引并向后工作来解决此问题。 或者只是总是删除索引
0
处的第一个子节点,直到集合为空。 无论哪种方式,您还可以通过使用RemoveAt()
方法来提高效率,该方法删除特定索引处的元素,而不是强制集合搜索直到找到元素。当然,还有
Clear()
方法。 因此,如果要一次删除所有元素,可以使用它而不是自己编写循环。 - 你真的不应该首先自己操纵
UIElementCollection
。 如果你有这样的动态元素,你应该创建一个视图模型类来表示StackPanel
每个元素,创建该类的实例并将它们添加到例如ObservableCollection
,然后将该集合绑定到一个的ItemsSource
。ItemsControl
使用StackPanel
作为ItemsPanel
(ItemsControl
默认使用)。完成后,您只需根据需要操作集合即可添加/删除/重新排列元素。 当然,这样做可以避免你在这里犯的错误。 🙂
stackPanel.Children
返回一个UIElementCollection,所以你可以像这样使用Clear()
:
stackPanel.Children.Clear()
你能解释为什么不能一个一个地删除它们吗?
因为您正在修改迭代的同一个集合。 因此,当您在索引0处删除元素然后将循环变量增加到1时,索引0处的新项将永远不会被删除。
你可以通过向后迭代来解决这个问题。 这有效:
for (int i = stackPanel.Children.Count - 1; i >= 0; i--) { stackPanel.Children.Remove(stackPanel.Children[i]); } int x = stackPanel.Children.Count;
或者您可以按照stackPanel.Clear()
建议调用stackPanel.Clear()
方法。