gpt4 book ai didi

c# - NumericUpDown 背景色未按预期工作

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:03 24 4
gpt4 key购买 nike

我最近需要编写一个版本的 Windows NumericUpDown 控件,它可以突出显示某个值是否是必需的。它需要通过更改控件的背景颜色来实现。我认为这已经足够简单了,但在尝试这样做时,我发现它有一个奇怪的副作用,即无法完全绘制所有控件。

使用下面的代码,我看到了这个:

当我将控件放在 Windows 窗体上并更改 BackColor 属性(即,更改为蓝色)时,控件的整个数字部分都会改变颜色。或者,如果我更改我的“IsMandatory”属性,并不是所有的背景颜色都会改变(它会留下一个边框)。因此,如果我将 BackColor 更改为蓝色,然后将 IsMandatory 设置为 True,我将得到一个带有蓝色边框的浅蓝色控件(强制颜色)

鉴于它们都使用相同的代码,我不明白为什么会这样。

非常受欢迎的想法或解释。

   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);
}
}

Here's what it looks like:

最佳答案

有趣的问题,它演示了覆盖虚拟成员如何产生意想不到的副作用。核心问题是您的 BackColor 属性 getter ,它总是返回 _backColor 属性值,即使您使用 IsMandatory 将其强制为不同的值。 Winforms 在需要绘制控件背景时也会使用该属性 getter。因此,您将返回 Blue,这解释了为什么您会在屏幕截图中看到蓝色。

但奇怪的是它仍然适用于控件的文本部分。那是因为 NumericUpdown 是由多个控件组成的。您有一个设置外部边界的 ContainerControl 并且是基类,您正在覆盖它的 BackColor 属性。但它内部还有另外两个控件,一个显示文本的 TextBox 和一个显示向上/向下按钮的控件。您的 BackColor 属性覆盖不会覆盖它们的 BackColor 属性。因此文本框部分将使用您指定给 Base.BackColor 的颜色绘制

要解决此问题,您将不得不停止对 BackColor 撒谎。有了额外的约束,您需要确保这在设计时仍然有效,以便实际的 BackColor 被序列化而不是 MandatoryColor:

[DefaultValue(typeof(Color), "Window"), Description("Overridden property")]
override public Color BackColor {
get {
return base.BackColor;
}
set {
_backColor = value;
MyResetColors();
}
}

private void MyResetColors() {
base.BackColor = this.IsMandatory && !DesignMode ? this.MandatoryBackColor : _backColor;
}

关于c# - NumericUpDown 背景色未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10631788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com