C# 未传递到静态方法的控件的标记属性
我在一个类HUD.cs中有下面的方法,它有helper方法。支持以下方法来检查所有控件标记是否为“必需”,并突出显示找到的控件 如果我从UserControl调用它,并且要突出显示的控件不包含在GroupBox中,但当它们被包含时,标记似乎不会出现,那么它就可以正常工作。想法 以下是方法-->C# 未传递到静态方法的控件的标记属性,c#,.net,winforms,controls,C#,.net,Winforms,Controls,我在一个类HUD.cs中有下面的方法,它有helper方法。支持以下方法来检查所有控件标记是否为“必需”,并突出显示找到的控件 如果我从UserControl调用它,并且要突出显示的控件不包含在GroupBox中,但当它们被包含时,标记似乎不会出现,那么它就可以正常工作。想法 以下是方法--> 这应该是正确定位标记(您可以通过在调试器中单步执行来检查这一点),因此我认为图形更有可能出现问题。这里有几件事可能会引起问题 首先,Control.Bounds属性是相对于父元素的。因此,当您递归到“子控
这应该是正确定位标记(您可以通过在调试器中单步执行来检查这一点),因此我认为图形更有可能出现问题。这里有几件事可能会引起问题 首先,Control.Bounds属性是相对于父元素的。因此,当您递归到“子控件”集合时,矩形是在“错误”的坐标处绘制的:例如,如果子控件位于组框的左上角,则其边界可能是(0,0100100),但实际上您希望在组框坐标处绘制矩形 其次,我相信子控件,因为它是一个单独的HWND,将出现在父控件的图形上下文的顶部。也就是说,您正在父控件(UserControl)上绘制,但子控件(GroupBox)位于父控件之上,使您的绘制变得模糊 对于这两个问题,解决方案都是获取子控件的图形上下文并将其传递到递归调用中
public static void HighlightRequiredFields(Control container, Graphics graphics, Boolean isVisible)
{
var borderColor = Color.FromArgb(173, 216, 230);
const ButtonBorderStyle borderStyle = ButtonBorderStyle.Solid;
const int borderWidth = 3;
Rectangle rect = default(Rectangle);
foreach (Control control in container.Controls)
{
if (control.Tag is string && control.Tag.ToString() == "required")
{
rect = control.Bounds;
rect.Inflate(3, 3);
if (isVisible && control.Text.Equals(string.Empty))
{
ControlPaint.DrawBorder(graphics, rect,
borderColor,
borderWidth,
borderStyle,
borderColor,
borderWidth,
borderStyle,
borderColor,
borderWidth,
borderStyle,
borderColor,
borderWidth,
borderStyle);
}
else
{
ControlPaint.DrawBorder(graphics, rect, container.BackColor, ButtonBorderStyle.None);
}
}
if (control.HasChildren)
{
foreach (Control ctrl in control.Controls)
{
HighlightRequiredFields(ctrl, graphics, isVisible);
}
}
}
}