Question

J'ai une classe qui hérite du TextBox Classe, appelez ça MyTextBox

Je voudrais redéfinir la valeur par défaut Background valeur pour cette classe.

J'ai donc cherché un moyen de le faire et j'ai trouvé une bonne option: appelez BackgroundProperty.OverrideMetadata()

Le problème est: où puis-je mettre cela?

dans le App.OnStartup()? Mot et pas pratique, j'aimerais que ce soit dans le fichier de code de ma classe.

dans le compriteur de la classe? J'obtiens une exception:

PropertyMetadata est déjà enregistré pour le type «mytextbox».

(me semble bien, je comprends pourquoi j'obtiens cela parfaitement)

J'ai donc regardé à nouveau un constructeur statique en C # (je n'ai pas fait plus tôt, quelle pitié)

Voici donc mon code:

public class MyTextBox : TextBox
{
    static MyTextBox()
    {
        MyTextBox.BackgroundProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(App.Current.Resources["CustomBackgroundBrush"]));
    }
}

Maintenant, je suis assez heureux avec ça, mais Microsoft ne l'est pas. À savoir, lorsque j'utilise la fonction d'analyse de code, j'obtiens ceci:

CA1810: Initialiser le type de référence champs statiques en ligne

D'où ma question: que puis-je faire à ce sujet?

  • ignorer l'avertissement? >> Je n'aime pas ignorer les avertissements
  • Déplacez l'appel vers la méthode Overdememetadata? >> J'aimerais, mais où?

Tous les conseils sont les bienvenus, merci

Éditer: J'ajouterai que je ne comprends pas complètement pourquoi j'obtiens cet avertissement, car je n'initialise rien par mot à dire dans mon constructeur statique, ou suis-je?

Était-ce utile?

La solution

Voici le lien de MSDN pour les métadonnées de remplacement pour Remplacer les métadonnées pour une propriété de dépendance:

Il indique: "Les métadonnées remplacées sur une propriété de dépendance doivent être effectuées avant que la propriété soit utilisée par le système de propriétés (cela équivaut au moment où des instances spécifiques d'objets qui enregistrent la propriété sont instanciées). Dans les constructeurs statiques du type qui se fournit comme le paramètre Fortype de Overdememetadata. "

Et le libellé du lien que vous avez publié vers CA1810 sur le moment de supprimer les avertissements:

Quand supprimer les avertissements

CA1810Il est sûr de supprimer un avertissement de cette règle si les performances ne sont pas une préoccupation; ou si les modifications de l'état global causées par l'initialisation statique sont coûteuses ou doivent être garanties avant qu'une méthode statique du type soit appelée ou une instance du type est créée.

Ainsi, votre implémentation actuelle et votre suppression de l'avertissement sont probablement la bonne voie.

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