Pregunta

Tengo una clase que hereda el TextBox Clase, llámalo MyTextBox

Me gustaría redefinir el valor predeterminado Background valor para esta clase.

Entonces busqué una manera de hacerlo y encontré una buena opción:llamar BackgroundProperty.OverrideMetadata()

El problema es:¿Dónde puedo poner esto?

en el App.OnStartup()?Feo y poco práctico, me gustaría que estuviera en el archivo de código de mi clase.

en el constructor de la clase?Recibo una excepción:

PropertyMetadata ya está registrado para el tipo 'myTextBox'.

(me parece bien, entiendo por qué entiendo esto perfectamente)

Así que volví a buscar y encontré algo sobre el constructor estático en C# (no había hablado de eso antes, qué lástima).

así que aquí está mi código:

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

Ahora estoy bastante contento con esto, pero Microsoft no.Es decir, cuando uso la función de análisis de código, aparece esto:

CA1810:Inicializar campos estáticos de tipo de referencia en línea

De ahí mi pregunta:¿qué puedo hacer al respecto?

  • ignorar la advertencia?>> No me gusta ignorar las advertencias
  • ¿mover la llamada al método overrideMetadata?>> Me gustaría, pero ¿dónde?

cualquier sugerencia bienvenida, gracias

Editar: Agregaré que no entiendo completamente por qué recibo esta advertencia, ya que no estoy inicializando nada por ejemplo en mi constructor estático, ¿o sí?

¿Fue útil?

Solución

Aquí está el enlace de MSDN para anular metadatos para anular metadatos para una propiedad de dependencia:

Afirma:"La anulación de metadatos en una propiedad de dependencia debe realizarse antes de que el sistema de propiedades ponga en uso esa propiedad (esto equivale al momento en que se crean instancias específicas de objetos que registran la propiedad).Las llamadas a OverrideMetadata deben realizarse dentro de los constructores estáticos del tipo que se proporciona como parámetro forType de OverrideMetadata".

Y el texto del enlace que publicó en CA1810 sobre cuándo suprimir las advertencias:

Cuándo suprimir las advertencias

CA1810Es seguro suprimir una advertencia de esta regla si el rendimiento no es una preocupación;o si los cambios de estado global causados ​​por la inicialización estática son costosos o se debe garantizar que ocurran antes de llamar a un método estático del tipo o crear una instancia del tipo.

Por lo tanto, su implementación y supresión actual de la advertencia es probablemente la ruta correcta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top