Come può & # 8220; predefinito & # 8221; i valori nei controlli WinForm ignorati devono essere evitati?

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

  •  10-07-2019
  •  | 
  •  

Domanda

Sto cercando di imparare e capire cosa e come C # fa le cose. Sono storicamente uno sviluppatore di Visual Foxpro (VFP) e un po 'viziato negli anni dell'eredità visiva creando la mia base di controlli utente da utilizzare a livello di applicazione.

Nel tentativo di imparare i parallelismi in C #, sono bloccato su qualcosa. Supponiamo di derivare il mio controllo etichetta (il controllo è una sottoclasse dell'etichetta) definito con un carattere "Arial", 10 punti. Quindi, su qualsiasi modulo a cui lo aggiungo, il Designer pre-compilerà automaticamente alcuni valori di proprietà che possono essere visualizzati in " Designer.cs " parte della classe 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";

Voglio impedire che cose come Font, Color, Size, AutoSize vengano generate ogni volta che viene inserito un controllo nel modulo. Se in seguito decido di cambiare il carattere da " Arial " 10, a "Tahoma" 11, dovrei tornare a tutti i moduli (e qualunque altro controllo personalizzato) e modificare per cambiare.

In VFP, se cambio qualcosa della mia base, tutti i moduli riconoscono automaticamente le modifiche. Non devo modificare nulla (ad eccezione di possibili allineamenti tramite impatti di dimensionamento) ... ma colore, font e tutto il resto non sono problemi in VFP ...

In C #, devo tornare indietro e cambiare ogni modulo in modo che sia riconosciuto dai valori nuovi / aggiornati della classe ...

C'è un modo ragionevole per evitarlo?

È stato utile?

Soluzione

Ecco una semplice soluzione che utilizza ReadOnlyAttribute nella classe derivata.

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

Il ReadOnlyAttribute disabiliterà la modifica delle proprietà nel designer VS.NET.

Altri suggerimenti

Invece di utilizzare " ReadOnlyAttribute " ;, prova a utilizzare " DefaultValueAttribute " anziché. Se ricordo bene, il progettista non dovrebbe creare il codice per impostare la proprietà se il valore corrente corrisponde al valore memorizzato in " DefaultValueAttribute " ;.

Prova ad aggiungere Attributo ReadOnly all'attributo ReadOnly proprietà delle classi derivate:

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

ReadOnlyAttribute dovrebbe applicare il comportamento ReadOnly in fase di progettazione.

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