编译时会重置重写的ForeColor属性

本文关键字:ForeColor 属性 重写 编译 | 更新日期: 2023-09-27 18:21:32

我有一个从Control:继承的自定义按钮

class MyButton : Control
    {
    ...

在这个控件中,我覆盖了ForeColor属性,如下所示:

public override Color ForeColor
{
    get
    {
        return _foreColor;
    }
    set
    {
        _foreColor = value;
        //Some other custom stuff is done here
    }
}

在MyButton的构造函数中,我初始化了各种属性,包括ForeColor:

public HMIButton() : base()
    {
        //Initialize default values
        SelectedForeColor = Color.White;
        ForeColor = Color.Black; 
        ...
    }

这样,第一次将按钮从"工具箱"拖动到窗体时,就会为属性指定默认值。此后,每次编译项目时,都会在窗体的.Designer.cs文件中设置属性:

    // 
    // myButton1
    // 
    ...
    this.myButton1.Location = new System.Drawing.Point(328, 148);
    this.myButton1.Name = "myButton1";
    this.myButton1.SelectedForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(30)))), ((int)(((byte)(30)))));
    ...

问题是这里没有列出属性ForeColor,所以每次编译应用程序时,ForeColor的值都会重置回构造函数中设置的值。

我想这与ForeColor属性是环境属性这一事实有关。我试着用"new"关键字来定义ForeColor,但没有什么区别。

我的问题是:如何强制Visual Studio从.Designer.cs文件中设置ForeColor属性,就像它对其他各种属性所做的那样?

编译时会重置重写的ForeColor属性

您更改了默认值,但没有告诉设计器。因此,它无法可靠地确定是否应该持久化该值。据它所知,你的ForeColor属性仍然是环境光,从未被指定。事实并非如此,您没有在属性重写中使用base.ForeColor。您必须使用属性上的[DefaultValue]属性来使其明智:

[DefaultValue(typeof(Color), "255,0,0,0")]
public override Color ForeColor { get; set; }

请注意,属性没有赢得任何奖励,这是属性构造函数只支持基元类型的必然副作用。另一种方法是提供两种私有方法:

private bool ShouldSerializeForeColor() {
    return ForeColor != initialForeColor;
}
private new void ResetForeColor() {
    ForeColor = initialForeColor;
}

其中initialForeColor现在可以是只读变量。