C# 从堆栈面板中移除子对象 for(int i=0;i

C# 从堆栈面板中移除子对象 for(int i=0;i,c#,wpf,C#,Wpf,运行上述代码之后。这些控件仍在屏幕上。那么x等于33。那么,如何真正删除子项呢?返回一个值,这样您就可以像这样使用Clear(): 如果没有好的代码,就不可能确切地知道代码在做什么,更不用说明确地解释它的行为了 然而,以下是一些观察结果: 根据你发布的代码,我希望一些孩子被删除。但是,由于在删除子项的同时更改了用于标识要删除的子项的索引,因此跳过了一半的子项。例如,当i为0时,删除第一个子项。但这样做会使第二个孩子成为第一个孩子。然后增加i。因此,下一次通过循环时,您不会删除最初是第二个子项的

运行上述代码之后。这些控件仍在屏幕上。那么x等于33。那么,如何真正删除子项呢?

返回一个值,这样您就可以像这样使用
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;