禁用按钮时如何避免颜色变化?
Posted
技术标签:
【中文标题】禁用按钮时如何避免颜色变化?【英文标题】:How to avoid color changes when button is disabled? 【发布时间】:2013-09-14 01:19:27 【问题描述】:我们有一个带有很多 FlatStyle 按钮的 Windows 窗体项目。
当我们禁用按钮时,按钮的颜色会自动改变。 :(
是否有可能以某种方式覆盖它,以便我们自己控制颜色?
【问题讨论】:
您希望文本颜色显示为已激活还是背景颜色? 激活时的文本颜色和激活时的背景色 - 实际上,对于某些按钮,一切都与激活时一样... 看到用户敲击一个被禁用但没有看起来禁用的按钮是 UI 悲剧。你不会从 Winforms 中得到任何帮助来调用这样的悲剧,它实现了 UI 设计指南规则。每个用户都熟悉的规则。您需要使用自己的按钮控件来创建自己的悲剧。 完全同意 - 该问题正在通过按钮图像更改来解决。 【参考方案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();
【讨论】:
优秀。唯一的问题是按钮上的图像仍然会改变颜色......我尝试使用 e.Graphics.DrawImage(),但它没有帮助。图像仍然会改变颜色:(但您的解决方案修复了文本颜色问题。 很高兴知道它有帮助。如果您得到问题的答案,请标记为已回答。 帮助很大。谢谢。 对于标签或复选框,请确保将AutoSize
属性设置为 false
。【参考方案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);
以及 Harsh 的回答中的 Button1_EnabledChanged 方法。
【讨论】:
我会避免在绘画事件中设置属性。【参考方案3】:关于按钮的 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
【讨论】:
【参考方案4】:我遵循以下方法:- 可以使用自定义变量控制按钮的 Click() 事件。
private bool btnDisabled;
private void btnClick(object sender, EventArgs e)
if(!btnDisabled) return;
这样按钮甚至不需要被禁用。该按钮仍然具有点击感,但不会执行任何操作。必须使用正确的颜色来表明该按钮已被禁用。
【讨论】:
【参考方案5】:我使用 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);
【讨论】:
【参考方案6】:提出建议永远不会太晚:
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
【讨论】:
以上是关于禁用按钮时如何避免颜色变化?的主要内容,如果未能解决你的问题,请参考以下文章
eclipse中android悬停时按钮的Android颜色变化