如何正确处理加载到Control.BackgroundImage中的位图

时间:2015-01-13 01:32:27

标签: c# bitmap dispose

所以我们正在尝试调整一个应用程序,所有这些古老的Winforms都是在Designer中这样的语句

this.btnCancel.BackgroundImage = ((System.Drawing.Image)resources.GetObject("btnCancel.BackgroundImage")));

在没有控件的地方,加载的位图是ImageList对象的一部分,当表单关闭时,其容器已在其上调用。 dotMemory认为仍然有许多优秀的位图,所以我怀疑它的这些BackgroundImage位图并没有被正确处理掉。

我可以看到两种选择,我都不喜欢这两种选择 1)跟踪具有背景图像的所有控件。在Dispose中手动将它们全部设置为null 2)遍历页面上的每个控件,如果它有BackgroundImage,则将其设置为null。

有没有更好的方法呢?

1 个答案:

答案 0 :(得分:0)

处理控制背景图像有两种不同的合理方法:

  1. 每个控件都有自己的background-image对象。当控件是(可能在控件的Disposed事件的处理程序中)时,应该处理该对象。

  2. 每个控件都会引用一个背景图像,其生命周期将是应用程序的生命周期。处置控件不应丢弃图像。

  3. 由于Microsoft希望允许方法#2,因此处理控件不会影响其背景图像;因此,有必要手动处理图像(如上所述,事件处理程序是一种很好的方法)。

    请注意,字体有类似于控件的问题,但字体处理的方式不同。为大多数控件设置Font属性将使它们获取其字体系列,大小,样式和其他特征的快照,但不会使它们实际使用该字体对象。控件可以从Font中获取必要的信息,即使它已被处置,因此控件既不会处置它们的Font也不会在意它是否处理掉。控件'BackgroundImage属性的行为可能有点类似(仅使用提供的图像一次,到控件私有的新位图,并在控件处理时放置),但将图像数据复制到位图比将字体系列,大小等复制到新的Font对象更昂贵。