我创建了一个包含大量控件的标签页,其中大部分位于顶级组框内。现在我决定我想要顶级组框的文本加粗,但不影响其他控件。然而,当我将顶级组框的字体设置为粗体时,其中包含的所有控件也变成了粗体,这正是我不想要的。我可以将每个单独控件的粗体属性设置为false,但似乎应该有更简单的方法来解决这个问题。有什么想法吗?
我可能忽略了一些明显的东西,比如一个正在盯着我的组框属性 - 如果是这种情况,我向您道歉。
提前感谢任何帮助。
我创建了一个包含大量控件的标签页,其中大部分位于顶级组框内。现在我决定我想要顶级组框的文本加粗,但不影响其他控件。然而,当我将顶级组框的字体设置为粗体时,其中包含的所有控件也变成了粗体,这正是我不想要的。我可以将每个单独控件的粗体属性设置为false,但似乎应该有更简单的方法来解决这个问题。有什么想法吗?
我可能忽略了一些明显的东西,比如一个正在盯着我的组框属性 - 如果是这种情况,我向您道歉。
提前感谢任何帮助。
您可以通过在GroupBox的标题上放置一个标签来规避问题,但我不一定推荐这样做。
一旦您理解了正在发生的事情以及为什么正在发生的事情,更好的解决方案就会出现。问题在于控件的字体(以及其他属性)是一个环境属性,这意味着子控件会继承其父/容器控件的属性。因此,如果您设置了GroupBox使用粗体字体,则默认情况下所有子控件都会自动继承粗体属性。
关键在于,默认情况下才适用环境属性。如果您不显式设置子控件的属性,则环境属性仍然适用。如果您不希望子控件为粗体,请选择它们并关闭粗体。父/容器的设置将不再覆盖新的自定义设置。
为了使事情变得更加简单,您可以向GroupBox添加一个Panel控件,将其停靠/锚定到填充整个GroupBox控件的客户端区域,并将其设置为使用标准的非粗体字体。然后,环境控件的规则规定添加到面板中的子控件默认情况下将不是粗体的。这样,您只需要更改一个控件的字体属性,而不是每个添加到GroupBox的子控件。
这比尝试在GroupBox标题上添加标签控件要好,因为GroupBox设计用来包含控件。您可以利用停靠和锚定属性,以确保一切都被正确排列,而且您不必在此过程中与设计人员进行斗争,以确保您的自定义标签正确覆盖GroupBox控件绘制的默认标签。此外,在运行时,您不会遇到Z顺序问题,也不会出现其他重绘问题,例如,标签控件意外隐藏在GroupBox后面,没有人能看到它(以及其他潜在的故障)。
<GroupBox Header="Group" FontSize="16" FontWeight="Bold">
<ContentControl Margin="0" FontSize="12" FontWeight="Regular">
...
...
...
</ContentControl>
</GroupBox>
<Extension()>
Public Sub UnBold(Of T As Control)(cc As Control.ControlCollection)
For Each c As Control In cc
If Not TypeOf c Is T AndAlso c.GetType.GetProperty("Font") IsNot Nothing Then
Dim RegularFont As New Font(c.Font.FontFamily, c.Font.Size, FontStyle.Regular)
c.Font = RegularFont
ElseIf c.HasChildren Then
UnBold(Of T)(c.Controls)
End If
Next
End Sub
在表单的OnLoad
事件中使用以下方式,取消所有GroupBox
(包括任何子GroupBox
)中所有控件的加粗效果:
Me.Controls.UnBold(Of GroupBox)()
GroupBox
中的所有控件(包括任何子 GroupBox
):MySpecificGroupBox.UnBold(Of GroupBox)()
有一个前提条件,如果您希望在GroupBox
内实际上保持控制的加粗状态,则需要在调用扩展之后在代码中设置。
var grpBox = new GroupBox()
{
Text = "",
Width = 780,
Height = 70,
Parent = panel1,
Dock = DockStyle.None,
AutoSize = false,
Visible = true,
Location = new Point(20, grpY)
};
var label = new Label()
{
AutoSize = true,
Parent = grpBox,
Enabled = true,
Name = "label" + btnNum++,
Location = new Point(5, 50),
Text = "",
Font = new Font(grpBox.Font, FontStyle.Regular)
};
var txtBox = new TextBox()
{
Width = 550,
Height = 23,
Location = new Point(65, 20),
Name = "txtBox" + btnNum++,
Parent = grpBox,
Enabled = true,
Tag = label,
Font = new Font(grpBox.Font, FontStyle.Regular)
};
grpBox.Font = new Font(grpBox.Font, FontStyle.Bold);