winforms 当按钮被禁用时,如何避免颜色变化?

xv8emn3q  于 2023-10-23  发布在  其他
关注(0)|答案(7)|浏览(308)

我们有一个Windows窗体项目,其中包含很多FlatStyle按钮。
当我们禁用按钮时,按钮的颜色会自动改变。|:(不支持)
有没有可能以某种方式覆盖它,这样我们就可以自己控制颜色了?

nbewdwxp

nbewdwxp1#

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

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

根据您的要求使用所需的颜色。
你还需要使用paint事件。

  1. private void Button1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  2. {
  3. dynamic btn = (Button)sender;
  4. dynamic drawBrush = new SolidBrush(btn.ForeColor);
  5. dynamic sf = new StringFormat {
  6. Alignment = StringAlignment.Center,
  7. LineAlignment = StringAlignment.Center
  8. };
  9. Button1.Text = string.Empty;
  10. e.Graphics.DrawString("Button1", btn.Font, drawBrush, e.ClipRectangle, sf);
  11. drawBrush.Dispose();
  12. sf.Dispose();
  13. }
展开查看全部
prdp8dxp

prdp8dxp2#

若要获得模糊程度较低的文本,请改用TextRenderer类:

  1. private void Button1_Paint(object sender, PaintEventArgs e)
  2. {
  3. Button btn = (Button)sender;
  4. // Make sure Text is not also written on button.
  5. btn.Text = string.Empty;
  6. // Set flags to center text on the button.
  7. TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak; // center the text
  8. // Render the text onto the button.
  9. TextRenderer.DrawText(e.Graphics, "Hello", btn.Font, e.ClipRectangle, btn.ForeColor, flags);
  10. }

并使用Button1_EnabledChanged方法,就像Harsh的答案一样。

py49o6xq

py49o6xq3#

在按钮的EnableChanged事件上

  1. private void button1_EnabledChanged(object sender, EventArgs e)
  2. {
  3. if (button1.Enabled == false)
  4. {
  5. button1.ForeColor = Color.DarkGray; //or pick the color you want when not enabled
  6. }
  7. else
  8. {
  9. button1.ForeColor = Color.White; //same here with the color
  10. }
  11. }
vsnjm48y

vsnjm48y4#

我使用ClientRectangle而不是e.ClipRectangle来避免按钮部分重绘时的剪辑效果:

  1. e.Graphics.Clear(BackColor);
  2. using (var drawBrush = new SolidBrush(ForeColor))
  3. using (var sf = new StringFormat
  4. {
  5. Alignment = StringAlignment.Center,
  6. LineAlignment = StringAlignment.Center
  7. })
  8. {
  9. e.Graphics.DrawString(Text, Font, drawBrush, ClientRectangle, sf);
  10. }
kmbjn2e3

kmbjn2e35#

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

  1. private bool btnDisabled;
  2. private void btnClick(object sender, EventArgs e)
  3. {
  4. if (!btnDisabled) return;
  5. }

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

yshpjwxd

yshpjwxd6#

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

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

nhjlsmyf7#

永远不会太迟的建议:

  1. public class BlackButton : Button
  2. {
  3. #region #Private Members
  4. private bool m_BasePaint = false;
  5. #endregion #Private Members
  6. #region #Ctor
  7. public BlackButton() : base()
  8. {
  9. base.ForeColor = Color.White;
  10. base.BackColor = Color.Black;
  11. this.DisabledForeColor = Color.FromArgb(0x6D, 0x6D, 0x6D);
  12. }
  13. #endregion #Ctor
  14. #region #Public Interface
  15. public Color DisabledForeColor
  16. {
  17. get;
  18. set;
  19. }
  20. #endregion #Public Interface
  21. #region #Overrides
  22. public override string Text
  23. {
  24. get
  25. {
  26. if (m_BasePaint)
  27. return "";
  28. return base.Text;
  29. }
  30. set
  31. {
  32. base.Text = value;
  33. }
  34. }
  35. protected override void OnPaint(PaintEventArgs pevent)
  36. {
  37. m_BasePaint = true;
  38. base.OnPaint(pevent);
  39. m_BasePaint = false;
  40. TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;
  41. TextRenderer.DrawText(pevent.Graphics,
  42. Text,
  43. base.Font,
  44. ClientRectangle,
  45. base.Enabled ? base.ForeColor : this.DisabledForeColor,
  46. flags);
  47. }
  48. #endregion #Overrides
  49. }
展开查看全部

相关问题