我最近需要编写一个版本的 Windows NumericUpDown 控件,它可以突出显示一个值是否是强制性的。它需要通过更改控件的背景颜色来做到这一点。我认为这很简单,但在尝试这样做时,我发现它有一个奇怪的副作用,即没有完全绘制所有控件。
使用下面的代码,我看到了:
当我在 Windows 窗体上放置一个控件并更改 BackColor 属性(即更改为 Blue)时,整个控件的数字部分都会改变颜色。如果,或者,我改变了我的“IsMandatory”属性,并不是所有的背景颜色都改变了(它留下了一个边框)。因此,如果我将 BackColor 更改为 Blue,然后将 IsMandatory 设置为 True,我会得到一个带有蓝色边框的 LightBlue 控件(强制颜色) 。
我不明白为什么会这样,因为它们都使用相同的代码。
想法或解释非常受欢迎。
public partial class MyNumericUpDown : NumericUpDown
{
private Boolean _isMandatory = false;
private Color _mandatoryBackColor = Color.LightBlue;
private Color _backColor = Color.FromKnownColor(KnownColor.Window);
[DefaultValue(typeof(Color), "Window"), Description("Overridden property")]
override public Color BackColor
{
get { return _backColor; }
set
{
_backColor = value;
MyResetColors();
}
}
[DefaultValue(typeof(Color), "LightBlue"), Category("Appearance")]
public Color MandatoryBackColor
{
get {return _mandatoryBackColor;}
set
{
_mandatoryBackColor = value;
MyResetColors();
}
}
[DefaultValue(false), Category("Behavior")]
public Boolean IsMandatory
{
get { return _isMandatory; }
set
{
_isMandatory = value;
MyResetColors();
}
}
private void MyResetColors()
{
base.BackColor = (this.IsMandatory ? this.MandatoryBackColor : this.BackColor);
}
}