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

时间:2013-07-14 12:09:20

标签: c# .net winforms system.drawing 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应该创建一个图像副本?

2 个答案:

答案 0 :(得分:5)

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

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

你会发现处置不再是问题。

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

答案 1 :(得分:1)

  

ImageList应该创建插入的所有图像的副本   它

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

相关问题