Domanda

Ho una lezione che eredita il TextBox Classe, chiamalo MyTextBox

Vorrei ridefinire il default Background valore per questa classe.

Quindi ho cercato un modo per farlo e ho trovato una buona opzione: chiama BackgroundProperty.OverrideMetadata()

Il problema è: dove posso metterlo?

nel App.OnStartup()? Brutto e non pratico, vorrei che fosse nel file di codice della mia classe.

nel controdtor della classe? Ricevo un'eccezione:

PropertyMetadata è già registrato per il tipo "MyTextBox".

(Mi sembra a posto, capisco perché lo ottengo perfettamente)

Così ho guardato di nuovo un trovato sul costruttore statico in C# (non ne ho fatto prima, che peccato)

Quindi ecco il mio codice:

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

Ora, sono abbastanza felice di questo, ma Microsoft non lo è. Vale a dire, quando utilizzo la funzione di analisi del codice, ottengo questo:

CA1810: Inizializza i campi statici del tipo di riferimento in linea

Da qui la mia domanda: cosa posso fare al riguardo?

  • ignorare l'avvertimento? >> Non mi piace ignorare gli avvertimenti
  • Spostare la chiamata al metodo overrideMetadata? >> mi piacerebbe, ma dove?

Eventuali suggerimenti benvenuti, grazie

Modificare: Aggiungerò che non capisco completamente perché ricevo questo avvertimento, dal momento che non sto inizializzando nulla per dire nel mio costruttore statico, o lo sono?

È stato utile?

Soluzione

Ecco il link da MSDN per il superamento dei metadati per Sovravando i metadati per una proprietà di dipendenza:

Dichiara: "I metadati prevalenti su una proprietà di dipendenza devono essere eseguiti prima che la proprietà venga messa in uso dal sistema di proprietà (ciò equivale al tempo in cui devono essere eseguite istanze specifiche di oggetti che registrano la proprietà). Devono essere eseguite le chiamate a overrideMetadata All'interno dei costruttori statici del tipo che si fornisce come parametro a quaranti di OverrideMetadata. "

E la formulazione dal link che hai pubblicato su CA1810 su quando sopprimere gli avvisi:

Quando sopprimere gli avvisi

CA1810È sicuro sopprimere un avvertimento da questa regola se la prestazione non è un problema; o se i cambiamenti di stato globale causati dall'inizializzazione statica sono costosi o devono essere garantiti prima che venga chiamato un metodo statico del tipo o viene creata un'istanza del tipo.

Pertanto, l'attuale implementazione e soppressione dell'avvertimento è probabilmente la via corretta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top