0

我知道組​​件模型通過PropertyDescriptor的ShouldSerializeValue方法指示屬性是否具有默認值。Control類如何提供ForeColor,BackColor和Font默認值?

基本的Windows表單Control類,有一個像前景色,背景色和字體一些特性,即默認爲父母的相同值,但我找不到任何TypeDescriptorPropertyDescriptor提供這些默認值。 Control類沒有實現ICustomTypeDescriptor,也沒有TypeDescriptionProviderAttribute。

Control類如何指示這些屬性應該被序列化? 它在哪裏爲這些屬性提供PropertyDescriptors?

謝謝!

回答

2

它們沒有默認值。這些屬性是「環境」屬性。 Control類檢測到它們已經發生屬性分配。如果這從來沒有發生過,它會使用Parent的相應屬性。這很好,它可以確保子控件使用與其容器相同的顏色和字體。

Control類中有一個ShouldSerializeForeColor()方法。它是內部的,不能被用戶代碼覆蓋。其他屬性也一樣。使用Reflector或.NET Reference Source進行查看。

MSDN Library文檔他們是這樣的:

Windows窗體控件使用環境 屬性,這樣子控件可以 出現像他們周圍的環境 。環境屬性是 控制屬性,如果未設置,則爲從父控件檢索到的 。如果 該控件沒有Parent, 並且該屬性未設置,則 控件將嘗試通過 Site屬性確定環境屬性的 值。如果控件是 未定位,如果站點不支持環境屬性,或者 屬性未在 AmbientProperties上設置,則該控件使用 自己的默認值。典型地,環境屬性表示控制的特徵,例如 BackColor,其被傳送給子控件 。例如,默認情況下,按鈕 將具有與其父窗體 相同的BackColor。由Control 類提供的屬性包括:Cursor,Font, BackColor,ForeColor和RightToLeft。

+0

Yeap !!!我剛剛確認組件模型使用名爲'ShouldSerialize + PropertyName'的方法來確定屬性是否應該序列化。我永遠無法想象!謝謝! – 2010-04-01 17:52:39

相關問題