0

Je sais que le modèle de composant indique si une propriété a une valeur par défaut ou non, au moyen de la méthode ShouldSerializeValue de PropertyDescriptor.Comment la classe Control fournit-elle les valeurs par défaut ForeColor, BackColor et Font?

Les fenêtres-formes de base Control de classe, a des propriétés comme ForeColor, BackColor et police, que par défaut la même valeur de la société mère, mais je ne pouvais pas trouver TypeDescriptor ou PropertyDescriptor qui fournit ces valeurs par défaut. La classe Control n'implémente pas ICustomTypeDescriptor ni TypeDescriptionProviderAttribute.

Comment la classe Control indique-t-elle que ces propriétés doivent être sérialisées ou non? Où fournit-il les PropertyDescriptors pour ces propriétés?

Merci !!!

Répondre

2

Ils n'ont pas les valeurs par défaut. Ces propriétés sont des propriétés "ambiantes". La classe Control détecte qu'une attribution de propriété s'est produite pour eux. Si cela ne s'est jamais produit, il utilise la propriété correspondante du Parent. Ce qui est bien, cela garantit que les contrôles enfants utilisent les mêmes couleurs et polices que leur conteneur.

Il existe une méthode ShouldSerializeForeColor() dans la classe Control. Il est interne et ne peut pas être remplacé par le code utilisateur. Idem pour les autres propriétés. Jetez un oeil-voir avec Reflector ou la source de référence .NET.

Les documents eux MSDN Library comme ceci:

contrôles Windows Forms utilisent propriétés ambiantes si les contrôles enfants peuvent apparaître comme leur environnement environnant. Une propriété d'environnement est une propriété de contrôle qui, si elle n'est pas définie, est récupérée à partir du contrôle parent. Si le contrôle n'a pas de parent, et que la propriété n'est pas définie, le contrôle tente de déterminer la valeur de la propriété ambiante via la propriété Site. Si le contrôle est non situé, si le site ne prend pas en charge les propriétés ambiantes ou si la propriété n'est pas définie sur les propriétés ambiantes , le contrôle utilise ses propres valeurs par défaut. Généralement, une propriété ambiante représente une caractéristique d'un contrôle, telle que BackColor, qui est communiquée à un contrôle enfant . Par exemple, un bouton aura le même BackColor que son parent par défaut. Les propriétés d'environnement fournies par la classe Control incluent: Curseur, Police, BackColor, ForeColor et RightToLeft.

+0

Yeap !!! Je viens de confirmer qu'une méthode nommée 'ShouldSerialize + PropertyName' est utilisée par component-model pour déterminer si la propriété doit être sérialisée ou non. Je ne l'imaginerais jamais! Merci! –