[英]How can I change the font color in a groupbox when I disable the groupbox
我在c#中使用Groupbox,首先,它已啟用。
當我使用Groupbox1.Enabled = false
,它的前景色(以及其中的所有前景色)都更改為默認黑色。 甚至命令label1.Forecolor = Color.White
不起作用。 (哪個label1
在Groupbox1
)。 當我啟用 Groupbox
,它會修復。 但是無論Groupbox1
是啟用還是禁用,我都希望它是White。
由於某些原因,無法在WinForms
世界中設置禁用控件的前景色。 而是從BackColor
計算禁用的前景色
從Label.OnPaint
(通過Reflector):
if (base.Enabled)
{
TextRenderer.DrawText(e.Graphics, this.Text, this.Font, r, nearestColor, flags);
}
else
{
Color foreColor = TextRenderer.DisabledTextColor(this.BackColor);
TextRenderer.DrawText(e.Graphics, this.Text, this.Font, r, foreColor, flags);
}
但是,您可以像這樣實現自定義Label
類:
public class MyLabel : Label
{
private const ContentAlignment anyBottom = ContentAlignment.BottomRight | ContentAlignment.BottomCenter | ContentAlignment.BottomLeft;
private const ContentAlignment anyMiddle = ContentAlignment.MiddleRight | ContentAlignment.MiddleCenter | ContentAlignment.MiddleLeft;
private const ContentAlignment anyRight = ContentAlignment.BottomRight | ContentAlignment.MiddleRight | ContentAlignment.TopRight;
private const ContentAlignment anyCenter = ContentAlignment.BottomCenter | ContentAlignment.MiddleCenter | ContentAlignment.TopCenter;
protected override void OnPaint(PaintEventArgs e)
{
// drawing the label regularly
if (Enabled)
{
base.OnPaint(e);
return;
}
// drawing the background
Rectangle backRect = new Rectangle(ClientRectangle.X - 1, ClientRectangle.Y - 1, ClientRectangle.Width + 1, ClientRectangle.Height + 1);
if (BackColor != Color.Transparent)
{
using (Brush b = new SolidBrush(BackColor))
{
e.Graphics.FillRectangle(b, backRect);
}
}
// drawing the image
Image image = Image;
if (image != null)
{
Region oldClip = e.Graphics.Clip;
Rectangle imageBounds = CalcImageRenderBounds(image, ClientRectangle, RtlTranslateAlignment(ImageAlign));
e.Graphics.IntersectClip(imageBounds);
try
{
DrawImage(e.Graphics, image, ClientRectangle, RtlTranslateAlignment(ImageAlign));
}
finally
{
e.Graphics.Clip = oldClip;
}
}
// drawing the Text
Rectangle rect = new Rectangle(ClientRectangle.X + Padding.Left, ClientRectangle.Y + Padding.Top, ClientRectangle.Width - Padding.Horizontal, ClientRectangle.Height - Padding.Vertical);
TextRenderer.DrawText(e.Graphics, Text, Font, rect, ForeColor, image == null ? BackColor : Color.Transparent, GetFormatFlags());
}
private TextFormatFlags GetFormatFlags()
{
TextFormatFlags flags = TextFormatFlags.GlyphOverhangPadding | TextFormatFlags.TextBoxControl | TextFormatFlags.WordBreak;
bool isRtl = RightToLeft == RightToLeft.Yes;
var contentAlignment = TextAlign;
if (isRtl)
contentAlignment = RtlTranslateContent(contentAlignment);
if ((contentAlignment & anyBottom) != 0)
flags |= TextFormatFlags.Bottom;
else if ((contentAlignment & anyMiddle) != 0)
flags |= TextFormatFlags.VerticalCenter;
else
flags |= TextFormatFlags.Top;
if ((contentAlignment & anyRight) != 0)
flags |= TextFormatFlags.Right;
else if ((contentAlignment & anyCenter) != 0)
flags |= TextFormatFlags.HorizontalCenter;
else
flags |= TextFormatFlags.Left;
if (AutoEllipsis)
flags |= TextFormatFlags.WordEllipsis | TextFormatFlags.EndEllipsis;
if (isRtl)
flags |= TextFormatFlags.RightToLeft;
if (UseMnemonic)
flags |= TextFormatFlags.NoPrefix;
if (!ShowKeyboardCues)
flags |= TextFormatFlags.HidePrefix;
return flags;
}
}
我手動更改了影響文本屬性的Groupbox的foreColor,字體如下所示:
使用-將所有出現的Enabled false更改為-
grpGeneral.ForeColor = SystemColors.GrayText;
grpGeneral.Enabled = false;
並使用-將所有出現的Enabled更改為true-
grpGeneral.Enabled = true;
grpGeneral.ForeColor = SystemColors.ActiveCaptionText;
如果是WPF,請將其放在您的XAML資源中:
<Style TargetType="GroupBox" x:Key="NameOfYourStyle">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
將樣式應用於您的GroupBox,即可完成工作。
<GroupBox Style="{StaticResource NameOfYOurStyle}"/>
迪米特里
或者,您根本無法禁用GroupBox。 相反,創建一個禁用其所有子級的方法。
private void DisableChildren(Control control)
{
foreach(var child in control.Controls.Cast<Control>().Where(child.GetType != typeof(Label) && child.GetType() != typeof(GroupBox)))
{
if(child.HasChildren)
{
DisableChildren(child);
}
child.Enabled = false;
}
}
您可以看到我沒有禁用標簽或嵌套的GroupBox。
像這樣在通常禁用GroupBox的地方使用;
DisableChildren(GroupBox1);
恰如其分:Windows窗體下的任何容器(GroupBox,Panel等)都發生同樣的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.