不能破坏我的纽扣标签
本文关键字:标签 我的 不能 | 更新日期: 2023-09-27 18:19:25
我正在为一家公司开发一个"缓存图像生成器"。
此表单的目标是预先计算所有可能的按钮场景。
它创建了几个自定义按钮,拍摄快照,清除所有内容,然后重做,直到它尝试了所有按钮。
我的问题是我不能销毁自定义按钮中的标签。
我的自定义按钮工作良好,我可以生成第一个图像。
因为我使用了索引作为标签名称的最后一部分,所以我认为第二轮将会失败,因为现有的项目具有相同的名称。
这就是我试图摧毁一切的方式:
foreach (my_button b in this.wrapper.Controls.OfType<my_button>())
{
b.resume_layout();
b.show();
}
this.PerformLayout();
bmp = new Bitmap(this.wrapper.Width, this.wrapper.Height);
this.wrapper.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
a.result = bmp;
cc = this.wrapper.Controls;
this.wrapper.Controls.Clear();
foreach (Control C in cc)
C.Dispose();
cc = null;
GC.Collect();
,这是my_button的自定义Dispose处理程序:
new public void Dispose()
{
this.Dispose(true);
}
protected override void Dispose(bool disposing)
{
this.currency_label.Dispose();
this.name_label.Dispose();
this.price_label.Dispose();
this.currency_label = this.name_label = this.price_label = null;
this.BackgroundImage = null;
this.Controls.Clear();
base.Dispose(disposing);
}
我相信这是一个非破坏性的麻烦,因为我随机得到这个:Illegal cross-thread operation: Control 'control name' accessed from a thread other than the thread it was created on.
上的标签Dispose()调用。
提前感谢任何帮助。
—EDIT—
我解决。问题是在我的mooremachine框架上错误的调用设置了所有的Visible=false
请删除这个问题,因为它不会有用。
跨线程调用异常的原因是您错误地实现了Dispose(bool)
。Dispose(bool)
可以从终结器方法中调用,并且调用线程是未指定的,例如它可以来自任何线程。
关于您添加的控件,您不需要添加额外的dispose方法。子控件将自动处理。
http://msdn.microsoft.com/en-us/library/a4zkb31d.aspx控制。处置方法(Boolean)
释放控件及其子控件使用的非托管资源控制和可选地释放托管资源。
无论如何,如果位图的所有者是my_button
并且没有其他对象将使用相同的位图,您可能想要处置自己的位图。您可以这样做:
protected override void Dispose(bool disposing)
{
if (disposing) {
var backgroundImage = this.BackgroundImage;
this.BackgroundImage = null;
backgroundImage.Dispose();
}
base.Dispose(disposing);
}
不需要重新声明Dispose()
方法