2009-06-30 18 views
0

Ich versuche, eine benutzerdefinierte Schaltfläche zu erstellen, wo die ForeColor immer karminrot ist und die BackColor immer Cyan ist. Hässliches Farbschema, aber ich versuche nur, es zu bekommen, so dass ich große Mengen von Steuerelementen mit einem konsistenten Farbschema erstellen kann, ohne jedes Steuerelement einzeln einzustellen. Hier ist, wie ich den Knopf codiert:Benutzerdefinierte Winforms-Steuerelemente (eine Schaltfläche speziell)

public partial class CustomButton : Button 
{ 
    private static Color _defaultForeColor = Color.Crimson; 
    private static Color _defaultBackColor = Color.Cyan; 

    public CustomButton() 
    { 
     InitializeComponent(); 
     base.ForeColor = _defaultForeColor; 
     base.BackColor = _defaultBackColor; 
    } 


    public AutoScaleMode AutoScaleMode { get; set; } 

    [DefaultValue(typeof(Color), "Crimson")] 
    override public Color ForeColor 
    { 
     get { return base.ForeColor; } 
     set 
     { 
      base.ForeColor = _defaultForeColor; 
     } 
    } 

    [DefaultValue(typeof(Color), "Cyan")] 
    public override Color BackColor 
    { 
     get { return base.BackColor; } 
     set 
     { 
      base.BackColor = _defaultBackColor; 
     } 
    }   
} 

Wenn ich die benutzerdefinierte Schaltfläche auf meine Form fallen, ist der Hintergrund der reguläre Schaltfläche Farbe und der Text ist purpurrot. Wenn ich die App laufe, ist es auch dasselbe. Wenn ich jetzt versuche, die Vordergrund- oder Hintergrundfarbe im Eigenschaftsfenster zu ändern, gehen sie direkt zu den Standardeinstellungen zurück, die ich eingestellt habe (karminrot, cyan) und dann erscheinen sie auch so, wenn ich meine App starte. Wie erreiche ich, dass die Steuerelemente im Designer und zur Laufzeit korrekt angezeigt werden?

Antwort

2

Das Problem besteht, weil UseVisualStyleBackColor automatisch auf true festgelegt ist und Sie es nicht überschreiben können. Wenn Sie es in false ändern, werden Sie feststellen, dass Ihre Schaltfläche ordnungsgemäß funktioniert.

Eine Option ist OnControlAdded der Schaltfläche wie folgt außer Kraft zu setzen:

protected override void OnControlAdded(ControlEventArgs e) 
{ 
    base.OnControlAdded(e); 
    UseVisualStyleBackColor = false; 
} 

Zum ersten Mal in dem Designer, die Farbe nicht zeigen, aber wenn Sie die Anwendung ausführen wird es korrekt funktionieren.

0

Ich schlage vor, dass Sie Vorder- und Hintergrundfarben z. B. an Anwendungseinstellungen binden (oder an spezielle Einstellungen für Ihre Steuerelemente). Standard-Schaltfläche und binden Sie in Designer, oder verwenden Sie Ihren eigenen Nachkommen und binden Sie in Code. In diesem Fall haben Sie ein konsistentes Farbschema und, was noch wichtiger ist, Sie können es ohne Neukompilierung ändern.

public class CustomButton : Button 
{ 
    public CustomButton 
    { 
     InitializeComponent(); 
     if (!DesignMode) 
     { 
      DataBindings.Add(new Binding("ForeColor", Settings.Default, "ButtonForeColor", true, DataSourceUpdateMode.Never)); 
      DataBindings.Add(new Binding("BackColor", Settings.Default, "ButtonBackColor", true, DataSourceUpdateMode.Never)); 
     } 
    } 

    // ... 
Verwandte Themen