Как избежать изменения цвета, когда кнопка отключена?

У нас есть проект Windows Forms с довольно несколькими кнопками FlatStyle.

Когда мы выключаем кнопки, цвета кнопок меняются автоматически Frown |: (

Можно ли как-то переопределить это, чтобы мы могли сами контролировать цвета?

Ответ 1

Для установки нужного цвета необходимо использовать событие EnabledChanged. Вот пример.

private void Button1_EnabledChanged(object sender, System.EventArgs e)
{
Button1.ForeColor = sender.enabled == false ? Color.Blue : Color.Red;
Button1.BackColor = Color.AliceBlue;
}

Используйте нужные цвета в соответствии с вашими требованиями.

Также вам нужно использовать событие paint.

private void Button1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
dynamic btn = (Button)sender;
dynamic drawBrush = new SolidBrush(btn.ForeColor);
dynamic sf = new StringFormat {
    Alignment = StringAlignment.Center,
    LineAlignment = StringAlignment.Center };
Button1.Text = string.Empty;
e.Graphics.DrawString("Button1", btn.Font, drawBrush, e.ClipRectangle, sf);
drawBrush.Dispose();
sf.Dispose();

}

Ответ 2

Чтобы получить менее-нечеткий текст, вместо этого используйте класс TextRenderer:

private void Button1_Paint(object sender, PaintEventArgs e)
        {
            Button btn = (Button)sender;
            // make sure Text is not also written on button
            btn.Text = string.Empty;
            // set flags to center text on button
            TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;   // center the text
            // render the text onto the button
            TextRenderer.DrawText(e.Graphics, "Hello", btn.Font, e.ClipRectangle, btn.ForeColor, flags);
        }

И метод Button1_EnabledChanged, как в суровом ответе.

Ответ 3

Я следовал следующему подходу: - Событием Click() кнопки можно управлять с помощью пользовательской переменной.

private bool btnDisabled;
private void btnClick(object sender, EventArgs e){
   if(!btnDisabled) return;}

Таким образом, кнопки даже не нужно отключать. У кнопки все еще есть ощущение щелчка, но никаких действий не будет. Необходимо использовать правильные цвета, чтобы сообщить, что кнопка отключена.

Ответ 4

Я использую ClientRectangle вместо e.ClipRectangle, чтобы избежать эффекта клипа, когда кнопка частично перерисовывается:

e.Graphics.Clear(BackColor);
using (var drawBrush = new SolidBrush(ForeColor))
using (var sf = new StringFormat
{
    Alignment = StringAlignment.Center,
    LineAlignment = StringAlignment.Center
})
{
    e.Graphics.DrawString(Text, Font, drawBrush, ClientRectangle, sf);
}

Ответ 5

Никогда не поздно для предложения:

public class BlackButton : Button
{
    #region #Private Members
    private bool m_BasePaint = false;
    #endregion #Private Members

    #region #Ctor
    public BlackButton() : base()
    {
        base.ForeColor = Color.White;
        base.BackColor = Color.Black;
        this.DisabledForeColor = Color.FromArgb(0x6D, 0x6D, 0x6D);
    }
    #endregion #Ctor

    #region #Public Interface
    public Color DisabledForeColor
    {
        get;
        set;
    }
    #endregion #Public Interface

    #region #Overrides
    public override string Text
    {
        get
        {
            if (m_BasePaint)
                return "";
            return base.Text;
        }
        set
        {
            base.Text = value;
        }
    }
    protected override void OnPaint(PaintEventArgs pevent)
    {
        m_BasePaint = true;
        base.OnPaint(pevent);
        m_BasePaint = false;

        TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak; 

        TextRenderer.DrawText(pevent.Graphics, 
            Text, 
            base.Font, 
            pevent.ClipRectangle, 
            base.Enabled ? base.ForeColor : this.DisabledForeColor, 
            flags);
    }
    #endregion #Overrides
}