根据MSDN,
Font
属性是环境属性,如果未设置,则从父控件中检索。
所以我在TextBox
内创建Form
。确保删除TextBox1.Font
属性,并在编译时,文本框显示父项的预期字体。奇怪的是,在处理HandleCreated
事件时(或在继承时检入控件构造函数时)并检查TextBox1.Font
它不是null
。
此外,我将Form1.Font
更改为更大的字体(从默认 Microsoft Sans Serif,8.25pt 到 Microsoft Sans Serif,9.75pt ),go到TextBox1.Font
属性并删除该值。编译时,文本框会按预期显示较大的父级字体。但在HandleCreated
事件中,TextBox1.Font == null
为false
(您无法删除控制字体属性,但至少它不会变为粗体)等等有趣的是,TextBox1.Font
不是 9.75pt 大小(父级字体大小),但Windows默认 8.25pt 。
我错过了什么?
只是为了补充代码
private void CtlTextBox_HandleCreated(object sender, EventArgs e)
{
if (this.Font == null)
{
MessageBox.Show("null");
}
else
{
MessageBox.Show(this.Font.Size.ToString());
}
}
因此,父级的字体可能会在以后的事件中设置为子控件。会是哪个活动?我没有想法。
答案 0 :(得分:2)
因此,父母的字体可能会在以后的事件中设置为子控件。
是的,将子控件添加到父级Controls
集合时,字体会更改。
会是哪个活动?
您可以处理子控件的FontChanged
事件以专门检测字体更改。如果要跟踪父级字体的设置,也可以尝试ParentChanged
。
它的实际工作原理: Control.Font
有一个getter,如果未明确设置字体,则会请求父字体。这包含在文档中:
Font属性是一个环境属性。环境属性是一个控件属性,如果未设置,则从父控件中检索。 ...
您还可以查看the reference source for Control.Font
:
public virtual Font Font {
...
get {
Font font = (Font)Properties.GetObject(PropFont);
if (font != null) {
//return control's font if it was explicitly set.
return font;
}
Font f = GetParentFont();
if (f != null) {
//otherwise, try to retrieve and return parent control's font
return f;
}
....
return DefaultFont;
}
因此,字体本身不会在过程中的任何位置设置。当子控件分配给父控件时,属性的返回值才会自动更改。
其他环境属性也是如此:BackColor
,ForeColor
,RightToLeft
等。您可以通过Control.AssignParent
的实现进行参考。