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

6
我正在处理一个包含表单的Windows应用程序。该表单包含一个分组框,其中有一些复选框。我已将此分组框设置为禁用状态。现在我的问题是复选框文本的前景色。它变成了浅灰色,如下图所示。
如何更改复选框文本的前景色,使其不再像禁用(浅灰色)?

可能是重复的问题,参考链接:https://dev59.com/NW025IYBdhLWcg3wclm-。 - Wagner DosAnjos
1
你必须手动绘制。 - Sriram Sakthivel
这个问题是关于标签的,但我认为你可以通过阅读以下内容来了解: https://dev59.com/kXVC5IYBdhLWcg3w9GHM - Mohsen Vaziri
你正在与自己所要求的行为作斗争。GroupBox中的控件属于它,因此遵守其“禁用”状态。如果您不想这样,请不要将它们放在组中。 - DonBoitnott
3个回答

13

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


但是,如果我想禁用包含复选框的整个面板,这种方法将不起作用。 - Ali Hussein Al-Issa

0

这是我在具有深色BackColor和浅色ForeColor的表单上使用的解决方法。当Label、CheckBox和GroupBox被禁用时,它们的ForeColor会变成黑色,因此我不使用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

0

您已经拥有了自绘CheckBox(或者它是某个组件的一部分),因此在需要的颜色中绘制其文本,忽略Enabled值的解决方案是正确的。

另一个可能性是不要禁用CheckBox的父容器,然后有很多可能性:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接