[英]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.