我知道组件模型通过 PropertyDescriptor的ShouldSerializeValue方法来指示属性是否具有默认值。
基本窗口形式Control
类,有一些属性,如 ForeColor,BackColor和Font ,默认为父级的相同值,但我找不到任何{{ 1}}或TypeDescriptor
提供这些默认值。 Control类不实现ICustomTypeDescriptor,也没有TypeDescriptionProviderAttribute。
Control类如何指示应该序列化这些属性? 它在哪里为这些属性提供PropertyDescriptors?
感谢!!!
答案 0 :(得分:2)
他们没有默认值。这些属性是“环境”属性。 Control类检测到它们已发生属性分配。如果从未发生过,它将使用Parent中的相应属性。这很好,它确保子控件使用与容器相同的颜色和字体。
Control类中有一个ShouldSerializeForeColor()方法。它是内部的,不能被用户代码覆盖。其他属性也是如此。看一下Reflector或.NET Reference Source。
MSDN Library将他们记录下来:
Windows窗体控件使用环境 属性,所以子控件可以 看起来像他们的周围 环境。环境属性是 控制属性,如果没有设置,是 从父控件中检索。如果 控件没有父级, 并且财产没有设定, 控制试图确定 环境属性的价值 网站属性。如果控件是 没有选址,如果网站没有 支持环境属性,或者如果支持 财产没有设置 AmbientProperties,控件使用 它自己的默认值。通常,一个 ambient属性表示 控制的特征,如 BackColor,传达给 儿童控制。例如,一个Button 将具有与其相同的BackColor 父表单默认情况下。周围 Control提供的属性 class include:Cursor,Font, BackColor,ForeColor和RightToLeft。