编译时会重置重写的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属性仍然是环境光,从未被指定。事实并非如此,您没有在属性重写中使用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现在可以是只读变量。