Come può & # 8220; predefinito & # 8221; i valori nei controlli WinForm ignorati devono essere evitati?
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?
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.