简体   繁体   English

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

[英]How to avoid color changes when button is disabled?

We have a Windows Forms project with quite a few FlatStyle buttons.我们有一个 Windows Forms 项目,其中包含很多 FlatStyle 按钮。

When we disable the buttons, the colors of the buttons are changed automatically Frown |:(当我们禁用按钮时,按钮的 colors 会自动更改 皱眉|:(

Is it possible to override this somehow, so we can control the colors ourselves?是否有可能以某种方式覆盖它,以便我们自己控制 colors?

You need to use the EnabledChanged event to set the desired color.您需要使用 EnabledChanged 事件来设置所需的颜色。 Here is an example.这是一个例子。

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

Use the desired colors according to your requirement.根据您的要求使用所需的颜色。

Also you need to use the paint event.您还需要使用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();

}

To get less-fuzzy text, use the TextRenderer class instead:要获得不那么模糊的文本,请改用 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);
        }

And the Button1_EnabledChanged method as in Harsh's answer.以及 Button1_EnabledChanged 方法,如 Harsh 的回答。

On the EnableChanged event of the button在按钮的 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
        }
    }

I followed the following approach :- The Click() event of the button can be controlled using custom variable.我遵循以下方法:- 可以使用自定义变量控制按钮的 Click() 事件。

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

This way the button doesn't even need to be disabled.这样按钮甚至不需要被禁用。 The button still has the click feel but no action will be taken.该按钮仍然有点击的感觉,但不会采取任何行动。 Have to use the right colors to communicate that the button is disabled.必须使用正确的颜色来传达按钮已禁用。

I use ClientRectangle instead of e.ClipRectangle to avoid clip effect when the button is partialy repaint :当按钮部分重绘时,我使用 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);
}

Another way to do this is to use the Pre_Render event.另一种方法是使用 Pre_Render 事件。 The example use Telerik but standard buttons should work fine too.该示例使用 Telerik,但标准按钮也应该可以正常工作。

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

Never too late for a suggestion:提出建议永远不会太晚:

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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 禁用时更改按钮颜色 - Change button color when disabled 禁用时如何更改asp按钮颜色,默认情况下按钮将在UI上禁用 - How to change asp button color when disabled, by default button will be disabled on UI WPF 禁用时按钮改变颜色 - WPF Button change color when disabled 如何更改禁用按钮的文本颜色? - How can I change the text color of a disabled button? 如何在运行时更改 UI.Button 禁用颜色? - How to change a UI.Button disabled color on runtime? 当文本框中没有文本时如何禁用按钮? - How to make a button disabled when no text is in a textbox? 如何设置禁用的表单控制按钮的文本颜色 - How do you set text color of disabled form control button 如何在WPF中将鼠标悬停时设置无边界按钮以更改其颜色 - How to set a borderless button which changes its color when mouse hovering in WPF 另一种应用颜色而不是SystemColors的方法,以避免在发布到较旧的Windows时发生颜色变化 - Other way to apply a color instead of SystemColors in order to avoid color changes when publishing to an older Windows Winforms:当启用设置为False时,如何用禁用的颜色(例如,灰色)替换单按钮图像颜色(例如,白色) - Winforms: How to Replace Single Button Image Color (e.g. white) with Disabled Color (e.g. gray) When Enabled Set to False
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM