2010-11-08 56 views
3

我有一个类似于PictureBox控件的图像显示控件,它需要一个位图并显示它。问题是我的控件会天真地尝试执行需要访问它的图像域的操作,即使已提供的位图已被丢弃。假设我有一个带有图像显示控件的窗体。我已经将Image属性设置为从文件加载的图像,然后出于某种原因(图像处理的原因和方式无关紧要)。然后我做了一些事情来重绘图像控件,当它试图访问现在处理的位图时,它会向左和向右抛出InvalidArgumentException。我理解这个问题,但对解决方案并不是100%信心。防止访问处置的参考

我的图像显示控件无法控制图像引用是否由调用代码处理,而且我没有公开的方法来检查对象是否被丢弃。我能想到的两种可能的解决方案:

  1. 存储位图在我的图像控制的副本(即克隆()所提供的图像),那么它不会不管发生什么事源图像。我认为这是最好的解决方案。
  2. 包装一切我可以在try/catch语句中想到 - 这是一个糟糕的选项,我只是为了防止其他人提出这个问题而将其包含在内。

在我执行选项#1(我认为最有意义的)之前,我想我会问这里是否有处理这种情况的最佳做法。

回答

2

当我在C#和WinForms中开发ImageViewer控件时,我有完全相同的困境。事实上,处理图像的责任是控制权的客户,而另一方面,处理不当的错误会导致控制权无法接受。

我使用了第一种方法 - 保留位图的本地/内部副本 - 除了内存使用情况外,它没有任何缺点。我相信这是更好的方法。

+0

感谢您的确认!我要制作本地副本,似乎是最合乎逻辑的方法。 – 2010-11-08 21:41:37

+0

你可能没有意识到这一点,但我们的答案基本相同。我只是觉得构造函数是表示这个想法的最简单的方法。事实上我很清楚参数少的构造函数的要求。 – ChaosPandion 2010-11-08 22:38:07

+0

@ChaosPandion得分10k +我相信你知道。它只是不禁不喜欢你的答案(虽然没有给-1)。 – Aliostad 2010-11-08 22:44:03

0

如果要更改位图上的任何像素,应始终对其进行克隆并更改克隆版本。

除此之外,您的解决方案可能是一个很好的解决方案。

+0

不改变任何东西,修改图形变换,但根本不会实际触及位图数据。 – 2010-11-08 21:40:22