Winforms Windows窗体:如何更改已禁用标签的字体颜色

Winforms Windows窗体:如何更改已禁用标签的字体颜色,winforms,Winforms,我正在尝试为标签控件设置禁用的字体特征。我可以设置所有字体特征(大小、粗体等),但颜色被默认的windows行为覆盖,这似乎是以下两种颜色之一: 如果背景色是透明的,则前景色与文本框禁用的颜色相同 若背景色设置为其他颜色,则前景色为深灰色 下图演示了该行为——第1列是标签,第2列是文本框,第3列是组合框 编辑--解释图像:前两行是标签、文本框和组合框的默认样式。在第二行中,我将背景颜色设置为红色,前景设置为白色。Microsoft禁用的字体样式处理不一致。是否尝试实现EnabledChan

我正在尝试为标签控件设置禁用的字体特征。我可以设置所有字体特征(大小、粗体等),但颜色被默认的windows行为覆盖,这似乎是以下两种颜色之一:

  • 如果背景色是透明的,则前景色与文本框禁用的颜色相同
  • 若背景色设置为其他颜色,则前景色为深灰色
下图演示了该行为——第1列是标签,第2列是文本框,第3列是组合框


编辑--解释图像:前两行是标签、文本框和组合框的默认样式。在第二行中,我将背景颜色设置为红色,前景设置为白色。Microsoft禁用的字体样式处理不一致。

是否尝试实现EnabledChanged事件?或者您是否在控件上寻找更多的“样式”属性(据我所知,它们不存在)?

为什么会出现这个问题


我个人会让windows来处理。人们习惯于以某种方式查看禁用的项目,因此如果您开始尝试更改其外观的各个方面,可能会让用户感到困惑。

您可能需要覆盖绘制事件。当控件被禁用时,我使用的所有工具包都有相同的问题。我猜他们让windows来绘制文本。至于标签,它们不是一个标准控件,这就是它们工作的原因。

看看这个方法;这可能会有帮助。我在为自定义控件重写OnPaint事件时使用过它

ControlPaint.DrawStringDisabled(g, this.Text, this.Font, Color.Transparent,
                new Rectangle(CustomStringWidth, 5, StringSize2.Width, StringSize2.Height), StringFormat.GenericTypographic);

对于文本框,可以将readonly属性设置为true,同时保持控件处于启用状态。然后可以将BackColor和ForeColor属性设置为您喜欢的任何颜色。用户仍可以单击控件并使光标闪烁,但无法编辑任何内容


不确定这是否会外推到其他控件类型,如组合框或诸如此类的控件,因为我还没有机会进行试验,但值得一试。

我用下面的OnPaint方法覆盖了控件的OnPaint方法。我粘贴了整个控件类以便于复制

public partial class NewLabel : Label
{
    public NewLabel()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        TextRenderer.DrawText(e.Graphics, this.Text.ToString(), this.Font, ClientRectangle, ForeColor);
    }

}