winforms 如何使分组框的文本加粗,而不使其中包含的控件的文本加粗?

f87krz0w  于 2022-12-14  发布在  其他
关注(0)|答案(5)|浏览(228)

我创建了一个包含大量控件的选项卡,其中大多数控件都包含在我所称的顶级分组框中。现在,我决定将顶级分组框的文本设置为粗体,而不是其他字体。但是,当我将顶级分组框的字体设置为粗体时,其中包含的所有控件也将变为粗体。这是我不想看到的。我可以将每个控件的bold属性设置为false,但似乎应该有一种更简单的方法来实现这一点。有什么想法吗?
我可能错过了一些明显的东西,比如一个组框属性,它就在我眼前--如果事实证明是这样的话,请道歉。
提前感谢您的帮助。

slsn1g29

slsn1g291#

您 * 可以 * 通过在GroupBox的标题上放置一个标签来绕过这个问题,但我不一定 * 推荐 * 这样做。
一旦您了解发生了什么以及为什么会发生,就会出现一个更好的解决方案。问题是控件的字体(以及其他内容)是一个 ambient 属性,这意味着子控件继承其父控件/容器控件的属性。因此,如果您将GroupBox设置为使用粗体字体,则默认情况下,它的所有子控件都会自动继承粗体属性。
当然,默认情况下,关键是存在的。环境属性只有在您没有显式地将子控件的属性设置为其他属性时才适用。如果您不希望子控件为粗体,请将它们全部选中并关闭粗体。父控件/容器的设置将不再覆盖新的自定义设置。
为了使事情变得更简单,您可以将Panel控件添加到GroupBox中,将其停靠/锚以填充GroupBox控件的整个工作区,并将其设置为使用标准的非粗体字体。然后,环境控件的规则规定添加到Panel中的子控件在默认情况下 * 不 * 为粗体。这样,您只需更改 * 一个 * 控件的字体属性,而不必更改添加到GroupBox中的每个子控件的字体属性。
这样做比尝试在GroupBox标题上添加Label控件更好,因为GroupBox是为包含控件而设计的。您可以利用对接和锚定属性来确保所有内容都得到正确排列,并且在这样做时,您不必与设计器进行斗争来确保自定义Label正确地覆盖GroupBox控件绘制的默认标签。此外,您不会遇到Z顺序问题或其他重绘问题,例如,当Label控件意外地隐藏在GroupBox * 后面 * 而没有人可以看到它时(以及其他许多潜在的问题)。

yb3bgrhw

yb3bgrhw2#

我在搜索相同的内容时遇到了这个老问题,并意识到它可以在代码中解决,而不必添加单独的控件,只是为了克服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 es):

MySpecificGroupBox.UnBold(Of GroupBox)()

附带条件是,如果您确实希望GroupBox中的控制实际上 * 保持 * 大胆,则必须在调用扩展后在代码中进行设置。

mec1mxoz

mec1mxoz3#

请考虑在GroupBox的文本区域上放置一个标签,并将标签的字体设置为粗体,以绕过此问题。
我做过一次,甚至使用了一个复选框(用于启用/禁用整个组)。工作起来很有魅力。

qacovj5a

qacovj5a4#

将所有控件放置在ContentControl内并重置字体参数

<GroupBox Header="Group" FontSize="16" FontWeight="Bold">
       <ContentControl Margin="0" FontSize="12" FontWeight="Regular">
   ...
   ...
   ...
       </ContentControl>
   </GroupBox>
j2cgzkjk

j2cgzkjk5#

通过编程可以按顺序执行此操作。假设您希望在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);

相关问题