¿Cómo puede & # 8220; predeterminado & # 8221; se pueden evitar los valores en controles WinForm anulados?

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

  •  10-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de aprender y comprender qué y cómo C # hace las cosas. Históricamente, soy un desarrollador de Visual Foxpro (VFP), y algo mimado por los años de herencia visual al crear mi propia línea base de controles de usuario para usar en toda la aplicación.

Al tratar de aprender los paralelos en C #, estoy atascado en algo. Digamos que obtengo mi propio control de etiqueta (el control es una subclase de etiqueta) definido con una fuente '' Arial '', 10 puntos. Luego, en cualquier formulario al que lo agregue, el Diseñador completará automáticamente algunos valores de propiedad que se pueden ver en el " Designer.cs " porción de la clase 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";

Quiero evitar que se generen elementos como Fuente, Color, Tamaño, Tamaño automático cada vez que se coloca un control en el formulario. Si más tarde decido cambiar la fuente de "Arial" 10, a "Tahoma" 11, tendría que volver a todos los formularios (y cualquier otro control personalizado) y editar para cambiar.

En VFP, si cambio algo de mi clase base, todos los formularios reconocen automáticamente los cambios. No tengo que editar nada (con la excepción de posibles alineaciones a través de los impactos de tamaño) ... pero el color, la fuente y todo lo demás no son problemas en VFP ...

En C #, tengo que regresar y cambiar cada formulario para que sea reconocido por los valores nuevos / actualizados de la clase ...

¿Hay alguna forma razonable de evitar esto?

¿Fue útil?

Solución

Aquí hay una solución simple usando ReadOnlyAttribute en la clase derivada.

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

El ReadOnlyAttribute deshabilitará la edición de propiedades en el diseñador VS.NET.

Otros consejos

En lugar de usar el " ReadOnlyAttribute " ;, intente usar el " DefaultValueAttribute " en lugar. Si no recuerdo mal, el diseñador no debería crear código para establecer la propiedad si el valor actual coincide con el valor almacenado en " DefaultValueAttribute " ;.

Intente agregar el atributo ReadOnly propiedades de sus clases derivadas:

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

El ReadOnlyAttribute debe aplicar el comportamiento de ReadOnly en tiempo de diseño.

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