如何使群组框中的文本加粗,但不包含在其中的控件的文本?

23

我创建了一个包含大量控件的标签页,其中大部分位于顶级组框内。现在我决定我想要顶级组框的文本加粗,但不影响其他控件。然而,当我将顶级组框的字体设置为粗体时,其中包含的所有控件也变成了粗体,这正是我不想要的。我可以将每个单独控件的粗体属性设置为false,但似乎应该有更简单的方法来解决这个问题。有什么想法吗?

我可能忽略了一些明显的东西,比如一个正在盯着我的组框属性 - 如果是这种情况,我向您道歉。

提前感谢任何帮助。


1
一个锚定在组框内的面板会起作用吗?其中子面板的字体不加粗,并将所有子控件添加到子面板中。 - Reddog
@Reddog:是的,那是一个更好的解决方案。我发现你的评论后才注意到自己也回答了同样的问题。 - Cody Gray
没关系。我把它发布为评论而不是答案,因为我不确定它是否有效...只是一种直觉。很高兴你发现它确实有效! - Reddog
5个回答

36

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

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

关键在于,默认情况下才适用环境属性。如果您不显式设置子控件的属性,则环境属性仍然适用。如果您不希望子控件为粗体,请选择它们并关闭粗体。父/容器的设置将不再覆盖新的自定义设置。

为了使事情变得更加简单,您可以向GroupBox添加一个Panel控件,将其停靠/锚定到填充整个GroupBox控件的客户端区域,并将其设置为使用标准的非粗体字体。然后,环境控件的规则规定添加到面板中的子控件默认情况下将是粗体的。这样,您只需要更改一个控件的字体属性,而不是每个添加到GroupBox的子控件。

这比尝试在GroupBox标题上添加标签控件要好,因为GroupBox设计用来包含控件。您可以利用停靠和锚定属性,以确保一切都被正确排列,而且您不必在此过程中与设计人员进行斗争,以确保您的自定义标签正确覆盖GroupBox控件绘制的默认标签。此外,在运行时,您不会遇到Z顺序问题,也不会出现其他重绘问题,例如,标签控件意外隐藏在GroupBox后面,没有人能看到它(以及其他潜在的故障)。


感谢您的详细解释。出于这个原因,我已经点赞并接受了您的答案,因为(就像reddog的答案一样),这是我选择的答案。我喜欢这个网站。 - RobC
Cody Gray 的解释非常出色。我真的以为我在寻找一个快速而简单的解决方案,即使只是为了使用最少的脑力。但是你的答案简明扼要地表明,更好的解决方案值得额外的思考。 - Arthur Hebert-Ryan

1
请将所有控件放置在ContentControl中,并重置字体参数。
   <GroupBox Header="Group" FontSize="16" FontWeight="Bold">
       <ContentControl Margin="0" FontSize="12" FontWeight="Regular">
   ...
   ...
   ...
       </ContentControl>
   </GroupBox>

ContentControl 是指 WPF。问题标记为 WinForms。 - LarsTech

1
当我搜索同样的问题时,我发现了这个旧问题,并意识到可以通过编写代码来解决,而不需要添加单独的控件来克服Code Gray在他的答案中提到的环境问题。请在模块中添加一个扩展,如下所示:
<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内实际上保持控制的加粗状态,则需要在调用扩展之后在代码中设置。


0
程序上你可以按顺序完成它。假设你想在groupbox中将字体样式设置为粗体,但不包括子控件。首先,在子控件中将字体设置为新的字体,这种情况下你可以传递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);

0
考虑通过在GroupBox的文本区域上放置标签并将标签的字体加粗来绕过该问题。 我曾经这样做过,甚至使用了一个复选框(用于启用/禁用整个组)。效果非常好。

@reddog:你的也很好,是我希望自己能想出来的。如果我最近没有花太多时间在这个项目上,我想我也会想到它的。不过,你的回答并没有一开始就吸引我的注意力。还是谢谢你。 - RobC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接