2009-03-12 11 views
3

Ich versuche zu lernen und zu begreifen, was und wie C# Dinge tut. Ich bin historisch ein Visual Foxpro (VFP) -Entwickler und etwas verwöhnt in den Jahren der visuellen Vererbung, indem ich meine eigene Basis von Benutzersteuerelementen erstellte, die anwendungsweit verwendet werden können.Wie können "Standard" -Werte in überschriebenen WinForm-Steuerelementen verhindert werden?

Beim Versuch, die Parallelen in C# zu lernen, stecke ich auf etwas fest. Sagen wir, ich leite mein eigenes Label-Steuerelement (Steuerelement ist Unterklasse des Labels) definiert mit einer Schriftart "Arial", 10 Punkt. Dann fügt der Designer bei jedem Formular, zu dem ich ihn hinzufüge, automatisch einige Eigenschaftswerte ein, die im Abschnitt "Designer.cs" der Form-Klasse zu sehen sind.

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"; 

möchte ich Dinge wie die Schriftart, Farbe, Größe, Auto-Size verhindern, dass jedes Mal, erzeugt immer eine Kontrolle über die Form gelegt wird. Wenn ich später beschließe, die Schriftart von "Arial" 10 auf "Tahoma" 11 zu ändern, müsste ich zu allen Formularen (und allen anderen benutzerdefinierten Steuerelementen) zurückkehren und sie bearbeiten, um sie umzustellen.

In VFP, wenn ich etwas von meiner Basisklasse ändern, erkennen alle Formulare automatisch die Änderungen. Ich muss nichts bearbeiten (mit Ausnahme von möglichen Ausrichtungen durch Dimensionierung Auswirkungen) ... aber Farbe, Schriftart und alles andere sind keine Probleme in VFP ...

In C# muss ich zurück gehen und Ändern Sie jedes Formular so, dass es von den neuen/aktualisierten Werten der Klasse erkannt wird.

Gibt es einen vernünftigen Weg, dies zu vermeiden?

Antwort

3

Hier ist eine einfache Lösung mit der ReadOnlyAttribute in der abgeleiteten Klasse.

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

Die ReadOnlyAttribute wird Eigentum Bearbeitung im VS.NET Designer deaktivieren.

1

Versuchen Sie, die ReadOnly attribute auf die Eigenschaften Ihrer abgeleiteten Klassen hinzu:

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

Die ReadOnlyAttribute das Verhalten Readonly zur Entwurfszeit erzwingen soll.

4

Anstatt "ReadOnlyAttribute" zu verwenden, verwenden Sie stattdessen "DefaultValueAttribute". Wenn ich mich richtig erinnere, sollte der Designer keinen Code zum Festlegen der Eigenschaft erstellen, wenn der aktuelle Wert mit dem in "DefaultValueAttribute" gespeicherten Wert übereinstimmt.

+0

Obwohl die Kommentare von den anderen für eine schreibgeschützte Funktion funktionieren, kann es vorkommen, dass einige der Standardwerte übertroffen werden. Daher mag ich Ihren Kommentar zur Option [DefaultValue (somevalue)]. Ich bekomme jedoch einen Fehler beim Versuch, eine Schriftart zurückzugeben. Der (somevalue) erwartet ein CONSTANT und kein neues obj – DRapp

+0

Versuchen Sie Folgendes: [DefaultValue (typeof (Schriftart), "Microsoft Sans Serif, 10 pt"]] (von dieser URL: http: //social.microsoft.com/ Foren/de-DE/netfxbcl/thread/9acb9a96-d461-4732-b99c-65390b4b53fa) – David

+0

Nein ... das wird immer noch erstellt in der Seite ... this.defLabel1.Font = new System.Drawing.Font ("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((Byte) (0))); Ich denke, ich bleibe (vorerst) die READ ONLY-Option für jetzt. – DRapp