禁用控件的文本颜色 - 如何更改它

Mqa*_*ati 9 .net c# label disabled-control winforms

在创建我令人敬畏的匹配游戏期间;)我发现了一个完全无法触及的问题.

当玩家选择带有符号的两个标签时,我想锁定所有其他标签4秒钟.

但是当我这样做时,所有标签的前景颜色变为灰色,符号可见.我的问题是 - 有没有一种方法来改变ForeColorvisual c#中的禁用标签?

该项目是一个WinForm应用程序.

目前我以这种方式在代码中设置标签的颜色:

label1.ForeColor = lable1.BackColor;
Run Code Online (Sandbox Code Playgroud)

当用户点击标签时,我将其更改为:

lable1.ForeColor = Color.Black;
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 9

比尝试更改Windows绘制禁用控件的方式更简单的方法是在希望Label有效"禁用" 时简单地设置标志,然后Click在执行任何操作之前检查事件处理程序方法中该标志的值.如果控件已被"禁用",则不要采取任何操作.

像这样的东西:

private bool labelDisabled = false;

private void myLabel_Click(object sender, EventArgs e)
{
    if (!labelDisabled)
    {
        this.ForeColor = SystemColors.ControlText;
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,请注意,您应该始终使用SystemColors而不是类似的东西Color.Black.
如果您对特定颜色值进行硬编码,则在用户自定义其默认Windows主题时,它们通常会发生冲突.Raymond Chen在他博客上的一篇文章中讨论了这个问题.

  • 只是评论"总是使用SystemColors"的建议 - 我会说它应该永远或永远 - 就像在硬编码所有颜色的所有颜色或没有.有时你想自己控制事物的外观,而不是成为Windows主题的奴隶.但是不要混淆它们,那就是当你把事情发生冲突时. (7认同)

All*_*der 9

只需使用重新定义的绘制事件创建自己的标签:

protected override void OnPaint ( System.Windows.Forms.PaintEventArgs e )
{
    if ( Enabled )
    {
        //use normal realization
        base.OnPaint (e);
        return;
    }
    //custom drawing
    using ( Brush aBrush = new SolidBrush( "YourCustomDisableColor" ) )
    {
        e.Graphics.DrawString( Text, Font, aBrush, ClientRectangle );
    }
}
Run Code Online (Sandbox Code Playgroud)

在文本绘制过程中要小心文本格式标志.