【问题标题】:When the parent's font is set to the child control?当父控件的字体设置为子控件时?
【发布时间】:2018-04-24 03:31:11
【问题描述】:

根据 MSDN,

Font 属性是环境属性,如果未设置,则会从父控件中检索。

所以我在Form 中创建了一个TextBox。确保删除TextBox1.Font 属性,编译后,文本框会按预期显示父字体。奇怪的是,在处理HandleCreated 事件时(或在继承时检查控件构造函数时)并检查TextBox1.Font 它不是null

此外,我将Form1.Font 更改为更大的字体(从默认的Microsoft Sans Serif, 8.25ptMicrosoft Sans Serif, 9.75pt),转到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());
    }
}

因此,可能在以后的事件中将父字体设置为子控件。会是什么活动?我没主意了。

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    因此,可能在以后的事件中将父字体设置为子控件。

    是的,当子控件添加到父控件的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的实现。

    【讨论】:

      猜你喜欢
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多