自定义 WinForms 按钮不会更改图像
本文关键字:图像 WinForms 按钮 自定义 | 更新日期: 2023-09-27 18:31:44
我创建了一个自定义按钮,称为AcceptButton,继承自System.Windows.Forms.Button
在构造函数上,我设置了一些属性,但最重要的是,一个图像(绿色复选标记),如下所示:
this.Image = Proyecto.Controls.Bases.Properties.Resources.ok_16;
当我使用 VS2013 窗体设计器添加此控件时,在引用我刚刚创建的 DLL 的另一个项目中,图像将正确显示。但是,如果我进入我的控件,并将代码中的图像更改为:
this.Image = Proyecto.Controls.Bases.Properties.Resources.ok_32;
使用此控件的项目中不会更改图像(即使已清理并重新生成解决方案)。我按照VS2013生成的代码,发现设计器添加了以下行:
this.botonAceptar1.Image = ((System.Drawing.Image)(resources.GetObject("botonAceptar1.Image")));
出于某种原因,此资源在 VS 生成的资源文件中"硬编码",但在我重新生成解决方案时不会更新。
删除此行使其按预期工作(我可以更改"上游"类中的图像,并在重新生成解决方案时对其进行更新)。
为什么会这样?我怎样才能避免这种情况?
这是由于DesignerSerializationVisibility
(MSDN) 属性而发生的。尝试将此属性和这些方法 (MSDN) 添加到类中:
public class MyButton : System.Windows.Forms.Button
{
public bool ShouldSerializeImage()
{
return !object.ReferenceEquals(this.Image, _BaseImage);
}
public void ResetImage()
{
this.Image = _BaseImage;
}
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Visible)]
public new Image Image
{
get { return base.Image; }
set { base.Image = value; }
}
private Bitmap _BaseImage;
public MyButton()
{
_BaseImage = Proyecto.Controls.Bases.Properties.Resources.ok_16;
this.Image = _BaseImage;
}
}
这将替换默认的 Image
属性并防止您遇到的序列化。此外,它还允许设计器检查属性是否具有默认值以及是否需要序列化。默认值存储在按钮类的私有字段中。这应该正确序列化(或不序列化)属性。
删除您拥有的所有按钮,重新编译,重新添加按钮以确保。