如何在winforms中更改禁用复选框的前景色

时间:2014-01-20 13:34:45

标签: c# winforms checkbox groupbox

我在具有表单的Windows应用程序中工作。此表单包含一个具有一些复选框的组框。我已将此组框设置为禁用。现在我的问题是复选框文本的前色。它变成浅灰色,如下图所示。

enter image description here

如何更改复选框文本的前景颜色,使其看起来不像禁用(浅灰色)。

3 个答案:

答案 0 :(得分:10)

不要禁用它,只需将AutoCheck属性设置为False

答案 1 :(得分:0)

您已经拥有所有者绘制的 CheckBox(或者它是某人的某个组成部分),所以解决方案是将其文本绘制为所需的颜色,忽略Enabled值,正确的。

其他可能性是不禁用CheckBox'es的父容器,那么有很多可能性:

  • 不要禁用GroupBox(这是出于某种原因,用户习惯使用它);
    • 以某种方式防止CheckBox点击(虽然这不符合要求):将AutoCheck设置为false,将Checked值恢复为在OnCheckedChanged;
  • 不要在禁用GroupBox内托管控件(闻起来很难^^):
    • 使用浮动面板,GroupBox在,而不是父母;
  • 请勿使用GroupBox
  • 使用自定义GroupBox

答案 2 :(得分:0)

这是我在具有深色BackColor和浅色ForeColor的窗体上使用的解决方法。标签,复选框和组框上的ForeColor禁用时会变为黑色,因此我不使用Form1.Enabled = False或Panel1.Enabled = False或GroupBox1.Enabled = False,而是使用Form1.Controls.SetEnabled(False), Panel1.SetEnabled(False)或GroupBox1.SetEnabled(False)。为了使扩展正常工作,您需要在希望使扩展可用的类中添加“导入扩展”。

Public Module Extensions
        ''' <summary>Sets Enabled property on most controls, set AutoCheck property on CheckBox controls, and ignores GroupBox and Label controls if Enabled parameter equals False.</summary>
        ''' <remarks>Purpose: Disabled GroupBox, Label, and CheckBox controls have Black ForeColor when disabled, making it difficult or impossible to read if background is dark color.</remarks>
        ''' <example>Instead of Panel1.Enabled=False, use Panel1.Controls.SetEnabled(Enabled:=False)</example>
        <Extension()>
        Public Sub SetEnabled(ByRef Controls As System.Windows.Forms.Control.ControlCollection, ByVal Enabled As Boolean, Optional ByVal Recursive As Boolean = True)
            For Each c As Control In Controls
                If Enabled = False Then
                    ' Do not disable some controls such as group boxes
                    Select Case c.GetType
                        Case GetType(GroupBox), GetType(Label)
                            ' Do nothing to control
                        Case GetType(CheckBox)
                            ' Change AutoCheck property instead
                            DirectCast(c, CheckBox).AutoCheck = False
                        Case Else
                            ' Disable control
                            c.Enabled = False
                    End Select
                Else
                    Select Case c.GetType
                        Case GetType(CheckBox)
                            ' Set Enabled and AutoCheck properties to true for CheckBox controls
                            With DirectCast(c, CheckBox)
                                .AutoCheck = True
                                .Enabled = True
                            End With
                        Case Else
                            ' Enable all other Controls
                            c.Enabled = True
                    End Select
                End If

                If Recursive = True AndAlso c.Controls IsNot Nothing AndAlso c.Controls.Count > 0 Then
                    c.Controls.SetEnabled(Enabled, Recursive)
                End If
            Next
        End Sub
End Module