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

本文关键字:BackgroundImage 位图 Control 正确处理 加载 | 更新日期: 2023-09-27 18:37:21

所以我们试图调整一个应用程序,在这些古老的Winforms上,设计器中到处都是这样的语句。

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

在没有控件的位置,加载的位图是 ImageList 对象的一部分,当窗体关闭时,该对象的容器已释放调用。 dotMemory认为仍然有许多未完成的位图,所以我怀疑是这些BackgroundImage位图没有得到适当的处理。

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

有没有更好的方法可以做到这一点?

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

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

  1. 每个控件都有自己的背景图像对象。 当控件位于(可能在控件的 Disposed 事件的处理程序中)时,应释放该对象。

  2. 每个控件都提供对背景图像的引用,该背景图像的生存期将是应用程序的生存期。 释放控件不应释放图像。

由于Microsoft希望允许方法 #2,因此释放控件不会影响其背景图像;因此,有必要手动释放图像(如前所述,事件处理程序是执行此操作的好方法)。

请注意,字体

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