C# 从堆栈面板中移除子对象 for(int i=0;i
运行上述代码之后。这些控件仍在屏幕上。那么x等于33。那么,如何真正删除子项呢?返回一个值,这样您就可以像这样使用C# 从堆栈面板中移除子对象 for(int i=0;i,c#,wpf,C#,Wpf,运行上述代码之后。这些控件仍在屏幕上。那么x等于33。那么,如何真正删除子项呢?返回一个值,这样您就可以像这样使用Clear(): 如果没有好的代码,就不可能确切地知道代码在做什么,更不用说明确地解释它的行为了 然而,以下是一些观察结果: 根据你发布的代码,我希望一些孩子被删除。但是,由于在删除子项的同时更改了用于标识要删除的子项的索引,因此跳过了一半的子项。例如,当i为0时,删除第一个子项。但这样做会使第二个孩子成为第一个孩子。然后增加i。因此,下一次通过循环时,您不会删除最初是第二个子项的
Clear()
:
如果没有好的代码,就不可能确切地知道代码在做什么,更不用说明确地解释它的行为了 然而,以下是一些观察结果:
i
为0时,删除第一个子项。但这样做会使第二个孩子成为第一个孩子。然后增加i
。因此,下一次通过循环时,您不会删除最初是第二个子项的内容,而是删除最初是第三个子项的内容。等等。您可以通过在末尾开始索引并反向工作来解决这个问题。或者始终删除索引
0
处的第一个子项,直到集合为空。无论哪种方法,您都可以通过使用RemoveAt()
方法来提高效率,该方法删除特定索引处的元素,而不是强制集合搜索直到找到该元素。当然,还有
Clear()
方法。因此,如果您想一次删除所有元素,您可以使用它而不是自己编写循环UIElementCollection
。如果您有这样的动态元素,您应该创建一个视图模型类来表示StackPanel
中的每个元素,创建该类的实例并将其添加到例如ObservableCollection
,然后将该集合绑定到ItemsControl
的ItemsSource
,该控件使用StackPanel
作为ItemsPanel
(默认情况下,ItemsControl
)
完成后,您只需根据需要操作集合,以添加/删除/重新排列元素。当然,这样做是为了避免你在这里犯的错误。:)李>
你能解释一下为什么不能一个接一个地移除它们吗 因为您正在修改迭代的同一个集合。因此,当您删除索引0处的元素,然后将循环变量增加到1时,索引0处的新项将永远不会被删除 您可以通过向后迭代来解决这个问题。这项工作:
stackPanel.Children.Clear()
或者你可以调用@StanleyS建议的
stackPanel.Clear()
方法。试试stackPanel.Children.Clear()
我怎么会错过这个!非常感谢。将其标记为答案,但由于我的分数很低,因此不会公开显示。不用担心,很高兴我提供了帮助!你能解释一下为什么不能一个接一个地删除它们吗?@lv.programmer你确定你把它标记为答案(绿色复选标记),而不是仅仅尝试向上投票(箭头向上)?无论你的声誉如何,你都应该能够标记出你问题的答案。()你的答案100%正确。有时候我就是做事情的方式不对,因为我不知道还有其他选择。我将遵循你的第二点。非常感谢。
stackPanel.Children.Clear()
for (int i = stackPanel.Children.Count - 1; i >= 0; i--)
{
stackPanel.Children.Remove(stackPanel.Children[i]);
}
int x = stackPanel.Children.Count;