【问题标题】:Removing Children from a StackPanel从 StackPanel 中删除子项
【发布时间】:2017-03-09 23:40:45
【问题描述】:
for(int i = 0; i < stackPanel.Children.Count; i++)
{
     stackPanel.Children.Remove(stackPanel.Children[i]);
}
int x  = stackPanel.Children.Count();

运行上述代码后。控件仍在屏幕上。那么 x 等于 33。那么我该如何真正移除孩子呢?

【问题讨论】:

  • 试试stackPanel.Children.Clear()

标签: c# wpf


【解决方案1】:

没有好的Minimal, Complete, and Verifiable code example,就不可能确切地知道你的代码在做什么,更不用说肯定地解释它的行为了。

但是,这里有一些观察:

  1. 根据您发布的代码,我预计 一些 孩子 被删除。但是因为您在移除孩子的同时改变了用于识别要移除的孩子的索引,所以您跳过了一半的孩子。例如。当i 为0 时,删除第一个孩子。但是这样做会导致第二个孩子现在成为第一个孩子。然后你增加i。因此,下一次循环时,您不会删除原来的第二个孩子,而是删除原来的第三个孩子。等等。

    您可以通过在末尾开始索引并向后工作来解决此问题。或者只删除索引0 处的第一个孩子,直到集合为空。无论哪种方式,您还可以通过使用RemoveAt() 方法来提高效率,该方法删除特定索引处的元素,而不是强制集合搜索直到找到元素。

    当然,还有Clear() 方法。因此,如果您想一次删除所有元素,可以使用它而不是自己编写循环。
  2. 首先你真的不应该自己操纵UIElementCollection。如果你有这样的动态元素,你应该创建一个视图模型类来表示StackPanel 中的每个元素,创建该类的实例并将它们添加到例如一个ObservableCollection&lt;T&gt;,然后将该集合绑定到使用StackPanel 作为ItemsPanel 的ItemsControl 的ItemsSource(默认情况下ItemsControl 会这样做)。

    完成后,您只需根据需要操作集合以添加/删除/重新排列元素。当然,这样做是为了避免你在这里犯的错误。 :)

【讨论】:

  • 你的 100% 正确。有时我只是没有以正确的方式做事,因为我不知道其他选择。我将遵循您的第二点。谢谢
【解决方案2】:

stackPanel.Children 返回一个UIElementCollection,所以你可以像这样使用Clear():

stackPanel.Children.Clear()

【讨论】:

  • 我怎么错过了!非常感谢。
  • 将其标记为答案,但由于我的分数太低,因此不会公开显示。
  • 别担心,很高兴我能帮上忙!
  • 能否也解释一下为什么不能一一删除?
  • @lv.programmer 你确定你把它标记为答案(绿色复选标志)而不是仅仅试图投票(向上箭头)?无论您的声誉分数如何,您都应该能够标记问题的答案。 (meta.stackexchange.com/questions/5234/…)
【解决方案3】:

能否也解释一下为什么不能一一删除?

因为您正在修改您迭代的同一个集合。因此,当您删除索引 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() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多