自定义WinForms按钮不改变图像?

2024-04-17

我创建了一个自定义按钮,名为 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 https://msdn.microsoft.com/en-us/library/system.componentmodel.designerserializationvisibilityattribute%28v=vs.110%29.aspx) 属性。尝试添加此属性和这些方法(MSDN https://msdn.microsoft.com/en-us/library/53b8022e%28v=vs.110%29.aspx)到你的班级:

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属性并阻止您遇到的序列化。此外,它允许设计者检查属性是否具有默认值以及是否需要序列化。默认值存储在按钮类的私有字段中。这应该正确序列化(或不序列化)属性。

删除所有按钮,重新编译,重新添加按钮以确保。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义WinForms按钮不改变图像? 的相关文章

随机推荐