Как сделать текст группы в блоке полужирным шрифтом, но не текст элементов управления, содержащихся в нем?
Я пошел и создал вкладку, содержащую большое количество элементов управления, большинство из которых содержатся в том, что я просто назову в блоке группы верхнего уровня. Теперь я решил, что текст группы верхнего уровня группы будет полужирным, но больше ничего. Однако, когда я устанавливаю шрифт группового окна верхнего уровня, выделенному полужирным шрифтом, все элементы управления, содержащиеся в нем, также выделяются жирным шрифтом, чего я не хочу. Я могу установить для каждого отдельного элемента управления bold значение false, но, похоже, должен быть более простой способ сделать это. Любые идеи?
Мне, вероятно, не хватает чего-то очевидного, как свойство группового ящика, которое смотрит мне в лицо - и извиниться, если это окажется так.
Заранее благодарим за помощь.
Ответы
Ответ 1
Вы можете обойти проблему, поместив надпись над заголовком для GroupBox, но я бы не стал рекомендовать это.
Лучшее решение возникает, когда вы понимаете, что происходит и почему это происходит. Проблема в том, что контрольный шрифт (среди прочего) является эмбиентным свойством, что означает, что дочерние элементы управления наследуют свойства родительского/контейнерного управления. Поэтому, если вы установите для GroupBox полужирный шрифт, все его дочерние элементы управления автоматически наследуют жирное свойство по умолчанию.
Ключ, конечно, по умолчанию. Свойства Ambient применимы только в том случае, если вы явно не задали свойствам детей другому. Если вы не хотите, чтобы дочерние элементы управления были выделены жирным шрифтом, выберите их все и отключите жирный шрифт. Настройки родителя/контейнера больше не будут отменять новые пользовательские настройки.
Чтобы сделать вещи еще проще, вы можете добавить элемент управления Panel в свой GroupBox, док-станцию /привязать его для заполнения всей клиентской области элемента управления GroupBox и установить для него стандартный шрифт без жирного шрифта. Затем в правилах внешнего контроля указывается, что дочерний элемент управления, который вы добавляете в Panel, по умолчанию не будет полужирным. Таким образом, вам нужно изменить свойство шрифта одного элемента управления, а не каждого дочернего элемента управления, добавляемого в GroupBox.
Причина, по которой это лучше, чем попытка добавить элемент управления Label над заголовком GroupBox, заключается в том, что GroupBox предназначен для управления элементами управления. Вы можете использовать свойства стыковки и привязки, чтобы убедиться, что все правильно настроено, и вам не придется бороться с дизайнером, когда вы делаете это, чтобы убедиться, что ваша пользовательская метка правильно закрывает этикетку по умолчанию, нарисованную элементом управления GroupBox, Кроме того, вы не столкнетесь с проблемами Z-порядка или не столкнетесь с другими проблемами перерисовки с их уродливыми головами во время выполнения, когда, например, элемент управления Label случайно скрывается за GroupBox, и никто не может его увидеть (и множество других потенциальных snafus).
Ответ 2
Рассмотрим обход проблемы, поместив метку над текстовой областью GroupBox и сделайте шрифт ярлыка полужирным.
Я сделал это один раз и даже использовал CheckBox (для включения/отключения всей группы). Работали как шарм.
Ответ 3
Я столкнулся с этим старым вопросом при поиске того же самого и понял, что он может быть разрешен в коде без добавления отдельного элемента управления только для преодоления проблемы окружения, о которой упоминает Code Grey в его ответе.
Добавьте расширения в модуль следующим образом:
<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
es в форме (включая любой дочерний элемент GroupBox
es), используя в форме OnLoad
событие:
Me.Controls.UnBold(Of GroupBox)()
Или для всех элементов управления в одном GroupBox
(опять же, включая любой дочерний элемент GroupBox
es):
MySpecificGroupBox.UnBold(Of GroupBox)()
При условии, что если вы действительно хотите, чтобы управление внутри GroupBox
фактически оставалось смелым, вам нужно будет установить его в коде после вызова расширения.