如何将组框的文本设置为粗体,但不将其中包含的控件的文本设置为粗体?

问题描述 投票:0回答:5

我创建了一个包含大量控件的选项卡,其中大部分都包含在我称之为顶级组框的内容中。现在我决定将顶级组框的文本设置为粗体,但没有其他内容。然而,当我将顶级组框的字体设置为粗体时,其中包含的所有控件也变为粗体,这是我不想要的。我可以将每个单独控件的粗体属性设置为 false,但似乎应该有一种更简单的方法来执行此操作。有什么想法吗?

我可能错过了一些明显的东西,比如一个正在盯着我的脸的组框属性——如果事实确实如此,请道歉。

预先感谢您的帮助。

vb.net winforms user-controls containers
5个回答
36
投票

可以通过在 GroupBox 的标题上放置标签来绕过问题,但我不一定推荐这样做。

一旦您了解发生了什么以及为什么会发生,就会出现更好的解决方案。问题是控件的字体(除其他外)是一个 ambient 属性,这意味着子控件继承其父/容器控件的属性。因此,如果将 GroupBox 设置为使用粗体字体,则其所有子控件都会默认自动继承粗体属性。

当然,默认情况下有密钥。仅当您未将子项的属性显式设置为其他内容时,环境属性才适用。如果您不希望子控件为粗体,请全部选择它们并关闭粗体。父级/容器的设置将不再覆盖新的自定义设置。

为了使事情变得更加简单,您可以将 Panel 控件添加到 GroupBox,将其停靠/锚定以填充 GroupBox 控件的整个工作区,并将其设置为使用标准的非粗体字体。然后,环境控件的规则规定,添加到面板的子控件默认情况下“不会”为粗体。这样,您只需更改 one 控件的字体属性,而不用更改添加到 GroupBox 的每个子控件。 这比尝试在 GroupBox 标题上添加 Label 控件更好的原因是因为 GroupBox 被设计为包含控件。您可以利用停靠和锚定属性来确保所有内容都正确排列,并且在这样做时您不必与设计人员对抗以确保您的自定义标签正确覆盖由 GroupBox 控件绘制的默认标签。此外,您不会遇到 Z 顺序问题或在运行时遇到其他重绘问题,例如,当 Label 控件意外隐藏在 GroupBox 后面并且没有人可以看到它时(以及许多其他控件)潜在的混乱)。

我在搜索相同问题时遇到了这个老问题,并意识到它可以在代码中解决,而无需添加单独的控件,只是为了克服 Code Gray 在他的答案中提到的氛围问题。


1
投票

<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

然后,通过在表单的

GroupBox
 事件中使用以下内容,取消窗体上所有 
GroupBox

中的所有控件(包括任何子

OnLoad
):

Me.Controls.UnBold(Of GroupBox)()

或者对于单个

GroupBox
 中的所有控件(同样,包括任何子 
GroupBox

es):


MySpecificGroupBox.UnBold(Of GroupBox)()

附带条件是,如果您确实希望在

GroupBox
 内进行控制,以真正 
stay

大胆,则必须在调用扩展后在代码中进行设置。

    
将所有控件放入 ContentControl 中并重置字体参数


1
投票

考虑通过在 GroupBox 的文本区域上放置标签并将标签的字体设置为粗体来绕过该问题。

0
投票

以编程方式,您可以按顺序执行。假设您希望在组框中将字体样式设置为粗体,但不在子控件中设置为粗体。首先在子控件中将字体设置为新的 Font,在这种情况下您可以传递 groupbox 字体属性。然后将组框字体样式更改为粗体。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.