【问题标题】:How to change forecolor of disable checkbox in winforms如何在winforms中更改禁用复选框的前景色
【发布时间】:2014-02-09 17:02:21
【问题描述】:

我正在使用具有窗体的 Windows 应用程序。此窗体包含一个带有一些复选框的组框。我已将此组框设置为禁用。现在我的问题是复选框文本的前景色。它变成了浅灰色,如下图所示。

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

【问题讨论】:

标签: c# winforms checkbox groupbox


【解决方案1】:

这是我在具有深色背景色和浅色前景色的表单上使用的解决方法。标签、复选框和组框上的前景色在禁用时变为黑色,因此我不使用 Form1.Enabled=False 或 Panel1.Enabled=False 或 GroupBox1.Enabled=False,而是使用 Form1.Controls.SetEnabled(False), Panel1.SetEnabled(False) 或 GroupBox1.SetEnabled(False)。要使扩展程序正常工作,您需要在希望使扩展程序可用的类中添加“Imports Extensions”。

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

【讨论】:

    【解决方案2】:

    不要禁用它,只需将 AutoCheck property = False

    【讨论】:

    • 但是如果我想禁用包含 CheckBox 的整个面板,这将不起作用。
    【解决方案3】:

    您已经owner-drawn CheckBox(或者它是某人的组件),因此以所需颜色绘制文本的解决方案,忽略 Enabled 值,是正确的。

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

    • 不要禁用GroupBox(这是有原因的,用户习惯使用它);
      • 防止CheckBox'es 以某种方式被点击(尽管这不是要求):通过将AutoCheck 设置为false,通过将Checked 值恢复回OnCheckedChanged
    • 不要在禁用的GroupBox 中托管控件(闻起来很臭^^):
      • 使用浮动面板,GroupBox在下面而不是父级;
    • 不要使用GroupBox
    • 使用自定义GroupBox

    【讨论】:

      最近更新 更多