我有一个继承自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属性,就像使用其他各种属性一样?
答案 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现在可以是只读变量。