如何避免按钮禁用时颜色变化?

问题描述 投票:0回答:7

我们有一个 Windows 窗体项目,其中有很多 FlatStyle 按钮。

当我们禁用按钮时,按钮的颜色会自动更改:(

是否可以以某种方式覆盖它,以便我们可以自己控制颜色?

c# winforms button colors backcolor
7个回答
29
投票

您需要使用EnabledChanged事件来设置所需的颜色。这是一个例子。

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

根据您的要求使用所需的颜色。

您还需要使用绘画事件。

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

5
投票

要获得不太模糊的文本,请改用 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 the 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 方法,如 Harsh 的答案中所示。


2
投票

在按钮的EnableChanged事件上

private void button1_EnabledChanged(object sender, EventArgs e)
    {
        if (button1.Enabled == false)
        {
            button1.ForeColor = Color.DarkGray; //or pick the color you want when not enabled
        }
        else
        {
            button1.ForeColor = Color.White; //same here with the color
        }
    }

1
投票

我使用 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);
}

1
投票

我遵循以下方法:- 可以使用自定义变量控制按钮的 Click() 事件。

private bool btnDisabled;

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

这样甚至不需要禁用该按钮。该按钮仍然具有点击感,但不会执行任何操作。必须使用正确的颜色来传达该按钮已禁用。


0
投票

执行此操作的另一种方法是使用 Pre_Render 事件。该示例使用 Telerik,但标准按钮也应该可以正常工作。

protected void radButton_PreRender(object sender, EventArgs e)
{
    RadButton btn = sender as RadButton;
    btn.BackColor = btn.Checked ? Color.LightBlue : Color.White;
}

-1
投票

提出建议永远不会太晚:

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, 
            ClientRectangle, 
            base.Enabled ? base.ForeColor : this.DisabledForeColor, 
            flags);
    }
    #endregion #Overrides
}
© www.soinside.com 2019 - 2024. All rights reserved.