2009-06-30 6 views
0

J'essaie de créer un bouton personnalisé sur lequel la précouche est toujours cramoisie et la couleur arrière est toujours cyan. Un jeu de couleurs horrible, mais j'essaie juste de l'obtenir pour pouvoir créer de grandes quantités de contrôles avec un schéma de couleurs cohérent sans régler chaque contrôle individuellement. Voici comment je le bouton codé:Commandes Winforms personnalisées (un bouton en particulier)

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

Lorsque je laisse tomber le bouton personnalisé sur ma forme, l'arrière-plan est la couleur du bouton régulier et le texte est rouge. Si je lance l'application, c'est la même chose. Maintenant, si j'essaie de modifier la couleur de fond ou la couleur de fond dans la fenêtre de propriétés, ils retournent à leurs valeurs par défaut que je définis (cramoisi, cyan) et ils apparaissent également de cette façon lorsque je lance mon application. Comment puis-je obtenir les contrôles apparaître correctement dans le concepteur et au moment de l'exécution?

Répondre

2

Le problème existe car UseVisualStyleBackColor est automatiquement défini sur true et vous ne pouvez pas le remplacer. Si vous le changez en faux, vous remarquerez que votre bouton fonctionnera correctement.

Une option consiste à remplacer OnControlAdded du bouton comme ceci:

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

première fois dans le concepteur, la couleur ne sera pas affiché, mais lorsque vous exécutez l'application, il fonctionnera correctement.

0

Je vous suggère de lier les couleurs avant et arrière à, par exemple, les paramètres de l'application (Ou la classe de paramètres spécifiques à vos contrôles). Bouton standard et lier dans le concepteur, ou utilisez votre propre descendant et lier dans le code. Dans ce cas, vous aurez un schéma de couleurs cohérent, et, plus important, vous pouvez le changer sans recompilation.

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)); 
     } 
    } 

    // ... 
Questions connexes