Comment peut-on & # 8220; défaut & # 8221; les valeurs dans les contrôles WinForm remplacés peuvent-elles être empêchées?

StackOverflow https://stackoverflow.com/questions/637222

  •  10-07-2019
  •  | 
  •  

Question

J'essaie d'apprendre et de comprendre ce que C # fait et comment. Je suis historiquement un développeur Visual Foxpro (VFP) et un peu gâché par les années d'héritage visuel en créant ma propre base de contrôles utilisateur à utiliser dans l'ensemble de l'application.

En essayant d’apprendre les parallèles en C #, je suis bloqué sur quelque chose. Supposons que je dérive mon propre contrôle d’étiquette (le contrôle est une sous-classe d’étiquette) défini avec une police de caractère "Arial", 10 points. Ensuite, quel que soit le formulaire auquel je l'ajoute, le concepteur pré-remplira automatiquement certaines valeurs de propriété qui peuvent être consultées dans le fichier "Designer.cs". partie de la classe Form.

this.LabelHdr2.AutoSize = true;
this.LabelHdr2.Font = new System.Drawing.Font("Arial", 14F, System.Drawing.FontStyle.Bold);
this.LabelHdr2.ForeColor = System.Drawing.Color.Blue;
this.LabelHdr2.Location = new System.Drawing.Point(150, 65);
this.LabelHdr2.Name = "LabelHdr2";
this.LabelHdr2.Size = new System.Drawing.Size(158, 22);
this.LabelHdr2.TabIndex = 5;
this.LabelHdr2.Text = "LabelHdr2";

Je souhaite éviter que des éléments tels que la police, la couleur, la taille et la taille automatique ne soient générés à chaque fois qu'un contrôle est placé sur le formulaire. Si par la suite je décide de changer la police de "Arial" 10 à "Tahoma" 11, je devrais revenir à tous les formulaires (et à d’autres contrôles personnalisés) et le modifier pour le changer.

Dans VFP, si je change quelque chose de ma classe de base, tous les formulaires reconnaissent automatiquement les modifications. Je n'ai rien à modifier (à l'exception des alignements possibles dus aux impacts de dimensionnement) ... mais la couleur, la police et tout le reste ne posent aucun problème dans VFP ...

En C #, je dois revenir en arrière et modifier chaque formulaire afin qu'il soit reconnu par les valeurs nouvelles / mises à jour de la classe ...

Existe-t-il un moyen raisonnable d'éviter cela?

Était-ce utile?

La solution

Voici une solution simple utilisant le ReadOnlyAttribute dans la classe dérivée.

class MyLabel : Label
{
    [ReadOnly(true)]
    public override Font Font
    {
        get { return new Font(FontFamily.GenericMonospace, 10); }
        set { /* do nothing */ }
    }
}

Le ReadOnlyAttribute a> désactive la modification des propriétés dans le concepteur VS.NET.

Autres conseils

Au lieu d'utiliser le "ReadOnlyAttribute", essayez d'utiliser le " DefaultValueAttribute " au lieu. Si mes souvenirs sont bons, le concepteur ne devrait pas créer de code pour définir la propriété si la valeur actuelle correspond à la valeur stockée dans le champ "DefaultValueAttribute".

Essayez d’ajouter l’attribut ReadOnly à propriétés de vos classes dérivées:

[ReadOnly(true)]
public override Font Font
{
    get{ // Your Implementation Here }
    set{ // Don't really care,do you? }
}

ReadOnlyAttribute doit appliquer le comportement ReadOnly au moment de la conception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top