将父级字体设置为子控件时?

时间:2018-04-24 03:31:12

标签: c# .net winforms

根据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 == nullfalse(您无法删除控制字体属性,但至少它不会变为粗体)等等有趣的是,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());
    }
}

因此,父级的字体可能会在以后的事件中设置为子控件。会是哪个活动?我没有想法。

1 个答案:

答案 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;
    }

因此,字体本身不会在过程中的任何位置设置。当子控件分配给父控件时,属性的返回值才会自动更改。

其他环境属性也是如此:BackColorForeColorRightToLeft等。您可以通过Control.AssignParent的实现进行参考。