Sostituire i metadati nel costruttore statico?
-
28-10-2019 - |
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?
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.