2012-02-09 66 views
5

Ho una forma (vedi screenshot):Visual Studio C# Windows Forms ... cambia il colore del pulsante?

default form look

Come si può vedere, la sua forma piuttosto semplice, con un pulsante Salva. L'ho programmato in modo tale che se uno qualsiasi dei campi di testo viene modificato, il pulsante "SALVA" cambia colore in modo che sia ovvio che non ho fatto clic su Salva e non dimentico di farlo. Sfortunatamente, cambiare semplicemente il BackColor del pulsante in rosso non è abbastanza, perché è UGLY come sin.

ugly backcolor unsaved

Cosa posso fare per cambiare il colore del pulsante al rosso, ma non come brutto. Come puoi vedere, "BackColor" non cambia l'intero pulsante, ma solo il pezzo interno. Il bordo è sempre lo stesso grigio trasparente vecchio stile.

+0

Forse il forecolor (invece del backcolor) sarebbe sufficiente? – ken2k

+0

Il modo più semplice per convertire l'applicazione in WPF è il controllo maggiore. Poiché si tratta di una buona quantità di lavoro, è necessario ereditare il controllo del pulsante e modificare la modalità di estrazione del pulsante, se si modifica il valore ** BackColor ** non esegue ciò che si desidera. –

+1

Personalmente avrei mantenuto il pulsante Salva disabilitato fino a quando qualcosa non fosse cambiato. Abilitato sui dettagli modificati, quindi disabilitarlo di nuovo al clic. Solo un'altra alternativa :) –

risposta

12

Un po 'di LinearGradientBrush può fare molto per ammorbidire la durezza di un pulsante rosso puro.

button1.ForeColor = Color.White; 

Bitmap bmp = new Bitmap(button1.Width, button1.Height); 
using (Graphics g = Graphics.FromImage(bmp)) { 
    Rectangle r = new Rectangle(0, 0, bmp.Width, bmp.Height); 
    using (LinearGradientBrush br = new LinearGradientBrush(
             r, 
             Color.Red, 
             Color.DarkRed, 
             LinearGradientMode.Vertical)) { 
     g.FillRectangle(br, r); 
    } 
    } 

allora si può solo assegnare l'immagine al BackgroundImage proprietà del pulsante:

button1.BackgroundImage = bmp; 

Risultato:

enter image description here

Nota: Assegnazione di un'immagine di sfondo perderà la colorazione del mouse hover del pulsante.

+0

Mi chiedo se è possibile utilizzare la trasparenza su BackgroundImage per farlo fondere con il pulsante originale. –

+0

Come dovrei quindi rimuovere l'immagine di sfondo? –

+0

@JasonAxelrod Basta un semplice 'button1.BackgroundImage = null;' funzionerebbe. – LarsTech

-1

questo non funzionerà in WinForms, ma si potrebbe desiderare di passare a WPF. È molto più comodo perché puoi configurare TUTTO. (Anche il colore di una barra di avanzamento)

Modifica: l'OP non deve riscrivere interamente la sua applicazione. Ha solo bisogno di rifare il layout di esso, il codice può essere C & P'd al nuovo progetto WPF, FYI

Edit²: Non c'è nemmeno bisogno di utilizzare il codice per modificare il colore di un WPF pulsante, puoi semplicemente definire una sovrapposizione rossa con il 30% di opacità nel file XAML. È così facile, davvero.

+1

Immagino che quei downvotes provenissero da persone che non hanno mai sentito parlare di WPF. –

+3

No, WPF è davvero una grande tecnologia. Ma poiché OP sta usando Winforms, la risposta "riscrivi tutta la tua applicazione, passa a WPF" è una risposta davvero brutta. – ken2k

+0

"Questo non funzionerà" non è una risposta reale, immagino. –

2

Un'altra soluzione potrebbe essere aggiungere un pulsante Icon (ad esempio punto esclamativo) al pulsante per informare l'utente che le modifiche non sono state ancora salvate.

+0

Un'altra soluzione potrebbe essere il salvataggio automatico. Si potrebbe anche usare Ribbon o ToolStrip. –

0

È possibile utilizzare solo una delle proprietà del pulsante, "FlatStyle". Di default, è standard. Ma se lo si passa a "Popup", il colore dello sfondo verrà esteso all'area del pulsante. È possibile confrontare i seguenti:

left-standard, right-popup

+0

benvenuto in SO! è scoraggiato risorgere vecchie domande (2012!), specialmente quelle che hanno accettato le risposte. – mzmm56

Problemi correlati