我正在处理一个包含表单的Windows应用程序。该表单包含一个分组框,其中有一些复选框。我已将此分组框设置为禁用状态。现在我的问题是复选框文本的前景色。它变成了浅灰色,如下图所示。
如何更改复选框文本的前景色,使其不再像禁用(浅灰色)?
如何更改复选框文本的前景色,使其不再像禁用(浅灰色)?
不要禁用它,只需将 AutoCheck 属性设置为 False
这是我在具有深色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
您已经拥有了自绘CheckBox
(或者它是某个组件的一部分),因此在需要的颜色中绘制其文本,忽略Enabled
值的解决方案是正确的。
另一个可能性是不要禁用CheckBox
的父容器,然后有很多可能性:
GroupBox
(这是有原因的,用户习惯于使用它);
CheckBox
被点击(虽然这不是要求):通过将AutoCheck
设置为false,在OnCheckedChanged
中恢复Checked
值;GroupBox
内托管控件(闻起来像是黑客^^):
GroupBox
在下面而不是父级;GroupBox
GroupBox
GroupBox
中的控件属于它,因此遵守其“禁用”状态。如果您不想这样,请不要将它们放在组中。 - DonBoitnott