0

我知道组件模型通过PropertyDescriptor 的 ShouldSerializeValue 方法指示属性是否具有默认值。

基本的 windows-formsControl类具有一些属性,例如ForeColor、BackColor 和 Font,它们默认为与父级相同的值,但我找不到任何TypeDescriptorPropertyDescriptor提供这些默认值的属性。Control 类没有实现 ICustomTypeDescriptor,也没有 TypeDescriptionProviderAttribute。

Control 类如何指示这些属性是否应该被序列化?它在哪里为这些属性提供 PropertyDescriptors?

谢谢!!!

4

1 回答 1

2

它们没有默认值。这些属性是“环境”属性。Control 类检测到为它们发生了属性分配。如果这从未发生过,它将使用父级的相应属性。这很好,它确保子控件使用与其容器相同的颜色和字体。

在 Control 类中有一个 ShouldSerializeForeColor() 方法。它是内部的,不能被用户代码覆盖。其他属性也一样。使用 Reflector 或 .NET 参考源进行查看。

MSDN Library像这样记录它们:

Windows 窗体控件使用环境属性,因此子控件可以看起来像它们周围的环境。环境属性是控件属性,如果未设置,则从父控件中检索。如果控件没有 Parent,并且没有设置属性,则控件会尝试通过 Site 属性确定环境属性的值。如果控件未定位,如果站点不支持环境属性,或者未在 AmbientProperties 上设置该属性,则该控件将使用其自己的默认值。通常,环境属性表示与子控件通信的控件的特性,例如 BackColor。例如,默认情况下,Button 将具有与其父 Form 相同的 BackColor。

于 2010-04-01T17:42:13.663 回答