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

标签 c# winforms

我创建了一个自定义按钮,称为 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 属性并阻止您遇到的序列化。此外,它还允许设计人员检查属性是否具有默认值以及是否需要序列化。默认值存储在按钮类的私有(private)字段中。这应该正确序列化(或不序列化)属性。

删除所有按钮,重新编译,读取按钮以确保。

关于c# - 自定义 WinForms 按钮不改变图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34996685/

相关文章:

c# - 如何使字段序列化到磁盘,但不深度克隆?

c# - 动态 Windows 窗体控件创建 - 一般问题

C#:在 RichTextBox 中粘贴 RTF,但保留颜色和格式(即:粗体、下划线等)

C# Hashtable 不保留值

c# - 事件处理程序和 C# 类析构函数/处置

c# - 将 ~280 个控件从 visible=true 更改为 visible=false 大约需要 8-9 秒(太长)

c# - 如何将列表计数绑定(bind)到标签

c++ - 人脸检测及图片预览图

c# - System.InvalidCastException : 'Unable to cast object of type ' System. String' 键入 'Newtonsoft.Json.Linq.JToken' 。'

c# - Signalr 程序集加载问题 OWIN