这是Silverlight InkPresenter中的错误吗?

时间:2011-01-10 17:36:20

标签: c# silverlight

这是一段自解释性的代码:

while (myInkPresenter.Children.Count > 0)
{
  myInkPresenter.Children.RemoveAt(myInkPresenter.Children.Count - 1);
}

然后我想更好的方法可能是:

foreach (UIElement item in myInkPresenter.Children)
{
  myInkPresenter.Children.Remove(item);
}

然而,这会引发错误:由于对象的当前状态,操作无效。 所以我有一个想法,并添加了一行额外的代码:

foreach (UIElement item in myInkPresenter.Children)
{
  myInkPresenter.Children.Remove(item);
  if (myInkPresenter.Children.Count == 0) break;
}

现在它运作正常。

我的问题是这是一个错误还是由于某种原因我应该期待这种行为?

1 个答案:

答案 0 :(得分:4)

您的代码仅在只有一个孩子的情况下才有效。如果还有更多,它将会中断 - 它将尝试查找“下一个”项,并注意其内部集合已更改,从而使迭代器无效。

这与InkPresenter本身无关 - 几乎.NET中的所有集合都以这种方式工作。基本上,您不应该在迭代时修改集合。 (.NET 4中的并发集合是此规则的一组值得注意的例外。)

鉴于您只想清除儿童名单,为什么不打电话:

myInkPresenter.Children.Clear();

?更简单,更易读,更高效。