2009-10-01 14 views
5

Sto costruendo un'applicazione WinForms e sto utilizzando colori specifici sulla maggior parte dei controlli. A volte lo faccio dal progettista WinForms e talvolta direttamente nel mio codice.Come implementare un codice colore a livello di applicazione in un'applicazione WinForm?

ho avuto una classe statica da qualche parte in cerca del genere:

public static class MyColors 
    { 
     public static Color DarkGreen = Color.FromArgb(0, 70, 62); 
     ... 
     public static Color Orange = Color.FromArgb(239, 132, 16); 

    } 

posso usare quei colori nel mio codice abbastanza facilmente, ma è impossibile fare dal progettista, che solleva questo errore:

MyColors.DarkGreen non è un valore valido per Int32.

(ho provato a memorizzare la rappresentazione Int32 di quei colori, ma questo viene a mancare con lo stesso errore)

La soluzione che sto utilizzando in questo momento è quello di utilizzare il codice di colore RGB nella finestra di progettazione , i valori della classe MyColors nel mio codice, e sto facendo cambiamenti usando la funzionalità replace di Visual Studio. Questa non è una buona soluzione, ma finora non sono riuscito a trovare un'idea migliore.

Qualche idea?


Nota: so di this question, che è leggermente diverso dal mio, come io non sto guardando cambiare le "KnownColors".

risposta

2

Per ottenere il supporto del designer per le definizioni di colore aggiuntive, è probabilmente necessario creare i propri editor che estendono o sostituiscono l'editor Color. Una volta definiti questi elementi, è necessario specificare al progettista quali proprietà devono utilizzare l'editor applicando l'attributo Editor alle proprietà interessate.

Potrebbe anche essere possibile ottenere un certo successo facendo qualcosa di simile con uno TypeConverter e lo TypeConverterAttribute.

+0

@Jeff: poiché voglio aggiornare i colori dei controlli di winform predefiniti (pulsante, etichetta, ecc.), Non posso realmente applicare l'attributo Editor alle loro proprietà ForeColor/BackColor, a meno che non erediti da tutti quei controlli, che suona un po 'eccessivo per me ... o mi sono perso qualcosa? – Brann

+0

@Brann: hai già ereditato implementando il modulo. Dovresti applicarlo per eseguire l'override all'interno del tuo modulo. –

+0

Ovviamente, i controlli all'interno del modulo dovrebbero essere impostati su Color.Empty per ereditare dal controllo genitore o bisognerà sovrascrivere anche quelli. Non credo che ci sia un'alternativa per ottenere il supporto del designer, temo. –

2

Non penso sia possibile, perché è necessario modificare il comportamento della finestra Proprietà stessa. Digitando "255, 128, 64" funziona perché la finestra Proprietà contiene codice che tenta di trasformare tutto ciò che è digitato in un colore di sistema, un colore "web" con nome, o un colore specificato RGB, e mostra "blah blah blah non è un valore valido per Int32. " messaggio per qualsiasi testo che non può convertire in modo corretto (come "MyColors.DarkGreen").

+1

È possibile sovrascrivere questo comportamento fornendo il proprio TypeConverter, ma è necessario sovrascrivere i controlli per aggiungerlo alle proprietà affinché funzioni. –

+0

@Jeff: ti credo, e come è tipico per StackOverflow, ottengo voti per dire "non puoi farlo" mentre non ottieni voti (fino al mio) per aver suggerito come puoi farlo. :) – MusiGenesis

1

La soluzione migliore è probabilmente non provare a fare nulla nel progettista. Lascia tutti i moduli con i colori predefiniti in fase di progettazione.

Sono stato in progetti che avevano uno schema simile al tuo e tutti i tipi di problemi insinuati. Un pulsante è stato impostato su un valore RGB nel designer; Un altro pulsante sullo stesso modulo ha il colore impostato nel codice (dalla classe statica) ei due colori sono leggermente diversi. Nel tempo questi problemi si insinueranno.

Se si desidera modificare un colore, è necessario modificare la classe statica e controllare tutti i moduli. Le sottili differenze non saranno ovvie.

Se si impostano tutti i colori nel codice, se si perde un controllo, sarà immediatamente evidente. Se decidi di cambiare un colore, devi solo cambiarlo in un posto.

Un altro tweak che abbiamo fatto è stato quello di aggiungere membri alla classe statica che aveva un utilizzo menzionato nel loro nome.

Ad esempio:

public static class MyColors 
    { 
     public static Color DarkGreen = Color.FromArgb(0, 70, 62); 
     ... 
     public static Color Orange = Color.FromArgb(239, 132, 16); 

     public static Color ButtonBackColor = DarkGreen; 
    } 

In questo modo, se si desidera modificare tutti i vostri tasti da verde scuro a Orange, è solo un cambiamento di una riga.

0

Questo dovrebbe darvi il risultato che state cercando. Probabilmente esiste un numero eccessivo di parentesi che è possibile rimuovere.

public static Color DarkGreen = Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(70)))), ((int)(((byte)(62))))); 
1

Se si sta cercando di avere un approccio tema, vale a dire le etichette con proprietà BackColor e ForeColor fissi creano un componente e cambiare il suo codice dietro come di seguito:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace YourNameSpace 
{ 
    public partial class NameOfStaticColoredLabel : Label 
    { 
     public NameOfStaticColoredLabel() 
     { 
      InitializeComponent(); 
     } 

     public NameOfStaticColoredLabel(IContainer container) 
     { 
      container.Add(this); 

      InitializeComponent(); 
     } 

     public override Color ForeColor 
     { 
      get 
      { 
       return Color.Black; 
      } 
      set 
      { 
       base.ForeColor = Color.Black; 
      } 
     } 

     public override Color BackColor 
     { 
      get 
      { 
       return Color.Aquamarine; 
      } 
      set 
      { 
       base.BackColor = Color.Aquamarine; 
      } 
     } 
    } 
} 

Come si può vedere tutto quello che deve fare sta ignorando le proprietà correlate del controllo etichetta. Quindi trascina e rilascia queste etichette nei moduli di domanda. Quando hai bisogno di cambiare colore, fallo semplicemente sopra la classe e ricostruisci l'app. Questo approccio creerà un'etichetta colorata statica e non potrai cambiarne il colore da designer o codice.