我们有一个Windows窗体项目,其中包含很多FlatStyle按钮。当我们禁用按钮时,按钮的颜色会自动改变。|:(不支持)有没有可能以某种方式覆盖它,这样我们就可以自己控制颜色了?
nbewdwxp1#
您需要使用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_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();}
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();
prdp8dxp2#
若要获得模糊程度较低的文本,请改用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);}
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的答案一样。
py49o6xq3#
在按钮的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 } }
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
vsnjm48y4#
我使用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);}
e.Graphics.Clear(BackColor);
using (var drawBrush = new SolidBrush(ForeColor))
using (var sf = new StringFormat
})
e.Graphics.DrawString(Text, Font, drawBrush, ClientRectangle, sf);
kmbjn2e35#
我遵循了以下方法:-可以使用自定义变量控制按钮的Click()事件。
private bool btnDisabled;private void btnClick(object sender, EventArgs e){ if (!btnDisabled) return;}
private bool btnDisabled;
private void btnClick(object sender, EventArgs e)
if (!btnDisabled) return;
这样,按钮甚至不需要被禁用。按钮仍有点击感觉,但不会采取任何操作。必须使用正确的颜色来传达该按钮已禁用。
yshpjwxd6#
另一种方法是使用Pre_Render事件。示例使用Telerik,但标准按钮也应该可以正常工作。
protected void radButton_PreRender(object sender, EventArgs e){ RadButton btn = sender as RadButton; btn.BackColor = btn.Checked ? Color.LightBlue : Color.White;}
protected void radButton_PreRender(object sender, EventArgs e)
RadButton btn = sender as RadButton;
btn.BackColor = btn.Checked ? Color.LightBlue : Color.White;
nhjlsmyf7#
永远不会太迟的建议:
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}
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
7条答案
按热度按时间nbewdwxp1#
您需要使用EnabledChanged事件来设置所需的颜色。这里有一个例子。
根据您的要求使用所需的颜色。
你还需要使用paint事件。
prdp8dxp2#
若要获得模糊程度较低的文本,请改用TextRenderer类:
并使用Button1_EnabledChanged方法,就像Harsh的答案一样。
py49o6xq3#
在按钮的EnableChanged事件上
vsnjm48y4#
我使用ClientRectangle而不是e.ClipRectangle来避免按钮部分重绘时的剪辑效果:
kmbjn2e35#
我遵循了以下方法:-可以使用自定义变量控制按钮的Click()事件。
这样,按钮甚至不需要被禁用。按钮仍有点击感觉,但不会采取任何操作。必须使用正确的颜色来传达该按钮已禁用。
yshpjwxd6#
另一种方法是使用Pre_Render事件。示例使用Telerik,但标准按钮也应该可以正常工作。
nhjlsmyf7#
永远不会太迟的建议: