重写时,重写的ForeColor属性将被重置

时间:2014-09-11 09:08:13

标签: c# visual-studio

我有一个继承自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属性,就像使用其他各种属性一样?

1 个答案:

答案 0 :(得分:2)

您更改了默认值,但没有告诉设计师。因此无法可靠地确定该值是否应该持久化。据他所知,您的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现在可以是只读变量。