<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
5条答案
按热度按时间slsn1g291#
您 * 可以 * 通过在GroupBox的标题上放置一个标签来绕过这个问题,但我不一定 * 推荐 * 这样做。
一旦您了解发生了什么以及为什么会发生,就会出现一个更好的解决方案。问题是控件的字体(以及其他内容)是一个 ambient 属性,这意味着子控件继承其父控件/容器控件的属性。因此,如果您将GroupBox设置为使用粗体字体,则默认情况下,它的所有子控件都会自动继承粗体属性。
当然,默认情况下,关键是存在的。环境属性只有在您没有显式地将子控件的属性设置为其他属性时才适用。如果您不希望子控件为粗体,请将它们全部选中并关闭粗体。父控件/容器的设置将不再覆盖新的自定义设置。
为了使事情变得更简单,您可以将Panel控件添加到GroupBox中,将其停靠/锚以填充GroupBox控件的整个工作区,并将其设置为使用标准的非粗体字体。然后,环境控件的规则规定添加到Panel中的子控件在默认情况下 * 不 * 为粗体。这样,您只需更改 * 一个 * 控件的字体属性,而不必更改添加到GroupBox中的每个子控件的字体属性。
这样做比尝试在GroupBox标题上添加Label控件更好,因为GroupBox是为包含控件而设计的。您可以利用对接和锚定属性来确保所有内容都得到正确排列,并且在这样做时,您不必与设计器进行斗争来确保自定义Label正确地覆盖GroupBox控件绘制的默认标签。此外,您不会遇到Z顺序问题或其他重绘问题,例如,当Label控件意外地隐藏在GroupBox * 后面 * 而没有人可以看到它时(以及其他许多潜在的问题)。
yb3bgrhw2#
我在搜索相同的内容时遇到了这个老问题,并意识到它可以在代码中解决,而不必添加单独的控件,只是为了克服Code Gray在他的答案中提到的环境问题。
在模块中添加扩展,如下所示:
然后,在表单的
OnLoad
事件中使用下列指令,将表单上所有GroupBox
中的所有控件取消粗体(包括任何子GroupBox
):或者对于单个
GroupBox
中的所有控件(同样,包括任何子GroupBox
es):附带条件是,如果您确实希望
GroupBox
中的控制实际上 * 保持 * 大胆,则必须在调用扩展后在代码中进行设置。mec1mxoz3#
请考虑在GroupBox的文本区域上放置一个标签,并将标签的字体设置为粗体,以绕过此问题。
我做过一次,甚至使用了一个复选框(用于启用/禁用整个组)。工作起来很有魅力。
qacovj5a4#
将所有控件放置在ContentControl内并重置字体参数
j2cgzkjk5#
通过编程可以按顺序执行此操作。假设您希望在groupbox中而不是在子控件中将字体样式设置为粗体。首先在子控件中将字体设置为新的字体,在这种情况下,您可以传递groupbox字体属性。然后将groupbox字体样式更改为粗体。