如何检查自定义控件中 Enum 类型的 属性 值是否已更改?
How can I check if the Property value of type Enum in a Custom Control has changed?
我创建了一个继承自 Button
的自定义控件 class。
我这样做的原因是我需要创建相同的按钮,我不想每次都做所有事情。
另外,我想要一个下拉列表 select 或者我添加的属性,可以从表单设计器中的属性网格访问。
例如,我想要三种不同的颜色,没有其他颜色,所以我想要一个 DropDown selector on 这个新 属性。我为此使用了枚举并且它有效,但问题是当我 select 例如 Red
时,它不会改变颜色。我的代码是:
public class CustomButton : Button
{
public NormalColor CLR { get; set; }
public enum NormalColor
{
Red,
Blue,
Yellow
}
public CustomButton()
{
if (CLR == NormalColor.Blue)
{
BackColor = Color.Blue;
}
else if (CLR == NormalColor.Red)
{
BackColor = Color.Red;
}
else if (CLR == NormalColor.Yellow)
{
BackColor = Color.Yellow;
}
else
{
BackColor = Color.FromArgb(18, 18, 18);
}
ForeColor = Color.White;
FlatAppearance.BorderSize = 0;
FlatStyle = FlatStyle.Flat;
Size = new Size(100, 100);
MouseEnter += CustomButton_MouseEnter;
MouseLeave += CustomButton_MouseLeave;
MouseClick += CustomButton_MouseClick;
}
}
在控件构造函数中,您可以定义其基本(默认)属性,而不是其行为或控件如何响应用户设置。
您的 Public 属性已委托给此任务。
Note that I've inserted the InitializeComponent()
procedure, so the
Control can be dropped in a container from the ToolBox.
如果您想在设计时将控件的 BackColor
属性 隐藏在 属性 window 中,请覆盖 属性 并将其隐藏:
[EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
您可以这样更改 CustomButton
:
(使用当前设置,当您将控件从工具箱拖放到窗体上时,它将用红色 BackColor
和白色 ForeColor
绘制)。
public class CustomButton : Button
{
private NormalColor CurrentColorSelection = 0;
public NormalColor CLR
{
get { return CurrentColorSelection; }
set { SetBackColor(value); }
}
public enum NormalColor
{
Red,
Blue,
Yellow
}
public CustomButton() => InitializeComponent();
private void InitializeComponent()
{
SetBackColor(CurrentColorSelection);
this.ForeColor = Color.White;
this.FlatAppearance.BorderSize = 0;
this.FlatStyle = FlatStyle.Flat;
this.Size = new Size(100, 100);
this.MouseEnter += this.CustomButton_MouseEnter;
this.MouseLeave += this.CustomButton_MouseLeave;
this.MouseClick += this.CustomButton_MouseClick;
}
[EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
public override Color BackColor
{
get { return base.BackColor; }
set { base.BackColor = value; }
}
private void SetBackColor(NormalColor value)
{
this.CurrentColorSelection = value;
this.BackColor = Color.FromName(value.ToString());
}
//(...)
//Event Handlers
}
当您实例化按钮时 class 首先执行 constructor
,因此在您的代码流中确保在实例化时设置了 CLR
执行以下操作
public class CustomButton : Button
{
public NormalColor CLR
{
get;
private set;
}
public enum NormalColor
{
Red,
Blue,
Yellow
}
#region Constructor
public CustomButton(NormalColor backgroundColor)
{
CLR = backgroundColor;
if (CLR == NormalColor.Blue)
{
BackColor = Color.Blue;
}
/*Your other code*/
}
}
我创建了一个继承自 Button
的自定义控件 class。
我这样做的原因是我需要创建相同的按钮,我不想每次都做所有事情。
另外,我想要一个下拉列表 select 或者我添加的属性,可以从表单设计器中的属性网格访问。
例如,我想要三种不同的颜色,没有其他颜色,所以我想要一个 DropDown selector on 这个新 属性。我为此使用了枚举并且它有效,但问题是当我 select 例如 Red
时,它不会改变颜色。我的代码是:
public class CustomButton : Button
{
public NormalColor CLR { get; set; }
public enum NormalColor
{
Red,
Blue,
Yellow
}
public CustomButton()
{
if (CLR == NormalColor.Blue)
{
BackColor = Color.Blue;
}
else if (CLR == NormalColor.Red)
{
BackColor = Color.Red;
}
else if (CLR == NormalColor.Yellow)
{
BackColor = Color.Yellow;
}
else
{
BackColor = Color.FromArgb(18, 18, 18);
}
ForeColor = Color.White;
FlatAppearance.BorderSize = 0;
FlatStyle = FlatStyle.Flat;
Size = new Size(100, 100);
MouseEnter += CustomButton_MouseEnter;
MouseLeave += CustomButton_MouseLeave;
MouseClick += CustomButton_MouseClick;
}
}
在控件构造函数中,您可以定义其基本(默认)属性,而不是其行为或控件如何响应用户设置。
您的 Public 属性已委托给此任务。
Note that I've inserted the
InitializeComponent()
procedure, so the Control can be dropped in a container from the ToolBox.
如果您想在设计时将控件的 BackColor
属性 隐藏在 属性 window 中,请覆盖 属性 并将其隐藏:
[EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
您可以这样更改 CustomButton
:
(使用当前设置,当您将控件从工具箱拖放到窗体上时,它将用红色 BackColor
和白色 ForeColor
绘制)。
public class CustomButton : Button
{
private NormalColor CurrentColorSelection = 0;
public NormalColor CLR
{
get { return CurrentColorSelection; }
set { SetBackColor(value); }
}
public enum NormalColor
{
Red,
Blue,
Yellow
}
public CustomButton() => InitializeComponent();
private void InitializeComponent()
{
SetBackColor(CurrentColorSelection);
this.ForeColor = Color.White;
this.FlatAppearance.BorderSize = 0;
this.FlatStyle = FlatStyle.Flat;
this.Size = new Size(100, 100);
this.MouseEnter += this.CustomButton_MouseEnter;
this.MouseLeave += this.CustomButton_MouseLeave;
this.MouseClick += this.CustomButton_MouseClick;
}
[EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
public override Color BackColor
{
get { return base.BackColor; }
set { base.BackColor = value; }
}
private void SetBackColor(NormalColor value)
{
this.CurrentColorSelection = value;
this.BackColor = Color.FromName(value.ToString());
}
//(...)
//Event Handlers
}
当您实例化按钮时 class 首先执行 constructor
,因此在您的代码流中确保在实例化时设置了 CLR
执行以下操作
public class CustomButton : Button
{
public NormalColor CLR
{
get;
private set;
}
public enum NormalColor
{
Red,
Blue,
Yellow
}
#region Constructor
public CustomButton(NormalColor backgroundColor)
{
CLR = backgroundColor;
if (CLR == NormalColor.Blue)
{
BackColor = Color.Blue;
}
/*Your other code*/
}
}