ImageList:处理原始图像会将其从列表中删除

ImageList应创建插入其中的所有图像的副本。 因此,在将原件添加到列表后处置原件应该是安全的。

为什么以下测试用例失败?

Bitmap test = new Bitmap(128, 128); ImageList il = new ImageList(); il.Images.Add(test); Assert.AreEqual(1, il.Images.Count); // OK, image has been inserted test.Dispose(); // now let's dispose the original try { var retrievalTest = il.Images[0]; } catch (ArgumentException) // ... but this Exception happens! { } Assert.AreEqual(1, il.Images.Count); // and this will fail 

这里似乎发生了这样的事情:当试图检索图像时,ImageList发现原件已被丢弃,并将其从ImageList中移除。

为什么会发生这种情况,我认为ImageList应该创建一个图像副本?

是的,ImageList创建位图的副本。 但是,您的测试代码与.NET框架中常见的着名惰性初始化模式相冲突。 重要的是它何时创建副本。 只有在必要时才会这样做。 对代码进行一些小改动,快点:

 il.Images.Add(test); var dummy = il.Handle; // <== NOTE: added test.Dispose(); // no problem 

而且你会发现处理不再是一个问题。

不知道如何在这里提供适当的建议,代码太合成了。 这通常很有效,ImageList在消费者开始使用其位图,Treeview或ListView时制作副本。 通常,避免使用ImageList作为集合对象,它不是为了完成那项工作。 将视图与模型分开,您将远离麻烦。

ImageList应创建插入其中的所有图像的副本。

我没有在文档中看到任何迹象,它确实如此。 所以简单的答案是:你的假设是错误的。