Bon, j'ai testé les deux méthodes.
La première donne ceci en C :
TypeDescriptor.GetProperties(bg)["ReadOnly"].SetValue(bg, value);
avec bg = nom de l'instance et "ReadOnly" le nom de ma propriété de test.
Résultat
, la propriété est affectée correctement ET l'étoile est générée.
La seconde donne ceci (là, j'ai eu un peu de mal, je cherchais après DirectCast dans les classes de Framework, je n'avais pas compris qu'il s'agissait d'une instruction VB.NET
)
(bg.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService).OnComponentChanged(bg, null, null, null);
Pareil: résultat 
Note au passage qu'avec ma chance habituelle, le premier test que j'ai fait montrait un bug. Il ne s'agissait ni d'un bug de ta méthode ni de mon contrôle, mais d'un bug du TextBox dont j'avais dérivé. En fait, ma couleur de fond ne se modifiait pas uniformément.
Pour voir ce bug, c'est simple : tu places un TextBox sur une form.
Puis tu affectes un texte quelconque à la propriété "Text".
Ensuite, sans avoir rien modifié d'autre, tu places la propriété "BackColor" sur la valeur "HotTrack". Amusant, non?
Et si on n'affecte pas explicitement une couleur de fond dans le constructeur d'un contrôle dérivé on obtient le même comportement pour n'importe quelle couleur de fond la première fois qu'on la modifie dynamiquement, ensuite ça refonctionne normalement.
Donc, merci pour les deux tuyaux, je vais remodifier tous mes SmartTags.
Pour Enabled :
Avec le Get, ça fonctionne, effectivement 
Et pour le set, ça fonctionne SEULEMENT si on utilise le propertyDescriptor également, sinon c'est sans effet (logique).
Donc : question initiale résolue, et effectivement j'aurais du te demander avant de dire que ce n'était pas possible 
Note que pour cette propriété, si on remonte à la source, on lui trouve un attribut spécifique [dpsIp(-514)], qui doit expliquer son comportement particulier à mon avis.
et il me semble que la sérialisation du fichier designer est codée en .net aussi (tu en parlais sur un autre topic)
Oui, c'est lié au TypeConverter.
J'ai réussi par exemple à faire utiliser par le designer un constructeur particulier avec paramètres plutôt que ses méthodes par défaut.
Un bon exemple est montré dans le PointConverter de la structure Point.
En remontant la hiérarchie on peut en fait apparemment imposer les syntaxes d'écriture du Designer.
J'ai d'autres questions, MAIS ne réponds que si tu as le temps et que ça ne t'ennuie pas
(évidemment tout qui veut répondre aussi est le bienvenu)
Je pose toujours, fais comme tu le sens :
J'ai examiné les designers "d'origine", et par exemple le TextBoxDesigner.
Et j'ai trouvé que pour certaines propriétés particulières on avait une méthodologie curieuse. Exemple, pour PasswordChar, on trouve ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| protected override void PreFilterProperties(IDictionary properties)
{
base.PreFilterProperties(properties);
string[] strArray = new string[] { "PasswordChar" };
Attribute[] attributes = new Attribute[0];
for (int i = 0; i < strArray.Length; i++)
{
PropertyDescriptor oldPropertyDescriptor = (PropertyDescriptor) properties[strArray[i]];
if (oldPropertyDescriptor != null)
{
properties[strArray[i]] = TypeDescriptor.CreateProperty(typeof(TextBoxDesigner), oldPropertyDescriptor, attributes);
}
}
} |
Outre le fait que manifestement c'est créé avec un générateur de code (vu que c'est prévu pour plusieurs propriétés et qu'ici on n'en a qu'une), j'ai tenté de comprendre ce que ce code faisait, et ma conclusion a été qu'en fait ça enlevait tous les attributs éventuels de la propriété "PasswordChar".
Le problème, en fait, c'est que ça ne semble enlever rien du tout en pratique, et que si je tente pareil avec une autre propriété de mon contrôle, ça n'a strictement aucun effet apparent. Donc : je ne comprends pas l'utilité de ce code.
Ensuite, joint à ça, on trouve la redéclaration de la propriété PasswordChar dans le designer lui-même :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| private char PasswordChar
{
get
{
TextBox control = this.Control as TextBox;
if (control.UseSystemPasswordChar)
{
control.UseSystemPasswordChar = false;
char passwordChar = control.PasswordChar;
control.UseSystemPasswordChar = true;
return passwordChar;
}
return control.PasswordChar;
}
set
{
TextBox control = this.Control as TextBox;
control.PasswordChar = value;
}
} |
Et là, je comprends encore moins l'utilité de cette propriété privée ??
De nouveau, j'ai tenté de faire pareil dans mon propre designer, mais de nouveau strictement sans aucun effet.
Je bute là-dessus, parce que vu que je dérive de ControlDesigner, j'ai peur d'oublier quelque chose d'important en créant mes propre designers.
Il ne s'agirait pas de détériorer quelque chose qui fonctionne en voulant simplement ajouter la fonctionnalité des SmartTags.
Merci
Partager