在继承的标签上设置Font.Bold

Win*_*Too 2 vb.net fonts controls winforms

我必须在标签上设置.Font.Bold = True,它没有定义.Font属性,但是从表单继承Font(名称,大小,样式).为此,我从表单的设计器文件中删除了她的.Font属性.

现在我需要将此标签的文本设置为粗体,而不为此标签定义字体名称,大小等.

我尝试:

label6.Font.Bold = True
Run Code Online (Sandbox Code Playgroud)

但这不起作用(PropertyFont.Bold只读).
如果我为这个标签设置字体,如:

label6.Font = New Font(myfontname, 10, FontStyle.Bold, GraphicsUnit.Point)
Run Code Online (Sandbox Code Playgroud)

然后我得到粗体文本但标签然后不再继承表单的字体大小.

这里可以将表单的字体继承保留为标签,但在此标签上获得粗体文本吗?

Cod*_*ray 5

不,因为您已经发现该Font.Bold属性是只读的.字体对象是不可变的,这意味着它们的属性一旦创建就无法更改.修改此属性的唯一方法是创建一个新的Font对象.

创建这个新Font时,您当然可以复制现有Font对象的属性(如表单使用的对象),但无法将两个Font对象动态耦合在一起.如果表单使用的字体大小发生更改,则将使用表单的新大小创建新的Font对象,但不会更新自定义粗体Font对象.

唯一让人困惑的是,如果你没有为子控件设置自定义字体,那就会有一些魔力.它们会自动继承父级的字体(容器控件,如表单).这些在未明确设置时从父级检索其值的属性称为环境属性.环境属性在适用的文档中进行了说明.但结果是,在你明确设置财产的地方,环境消失了.所以忘记这一点.

为了达到你想要的效果,我们需要在表单的字体大小发生变化时收到通知,作为响应,你可以使用Label控件的新大小创建一个新的粗体Font对象.幸运的是,FontChanged事件形式中只有这样一种机制.处理FontChanged表单的事件,作为响应,为Label控件创建一个新的Font对象.例如:

Private Sub myForm_FontChanged(ByVal sender As Object, ByVal e As EventArgs) Handles myForm.FontChanged
    Dim oldFont As Font = myLabel.Font
    myLabel.Font = New Font(myForm.Font, myForm.Font.Style Or FontStyle.Bold)
    oldFont.Dispose()
End Sub
Run Code Online (Sandbox Code Playgroud)

虽然,我不确定是否/为什么这是真的有必要.在应用程序运行时,很少更改表单的字体大小.通常只在创建时发生,在这种情况下,当您检索值以为Label控件创建自定义Font对象时,它已经正确设置.