【问题标题】:How to avoid color changes when button is disabled?禁用按钮时如何避免颜色变化?
【发布时间】:2013-09-14 01:19:27
【问题描述】:

我们有一个带有很多 FlatStyle 按钮的 Windows 窗体项目。

当我们禁用按钮时,按钮的颜色会自动改变。 :(

是否有可能以某种方式覆盖它,以便我们自己控制颜色?

【问题讨论】:

  • 您希望文本颜色显示为已激活还是背景颜色?
  • 激活时的文本颜色和激活时的背景色 - 实际上,对于某些按钮,一切都与激活时一样...
  • 看到用户敲击一个被禁用但没有看起来禁用的按钮是 UI 悲剧。你不会从 Winforms 中得到任何帮助来调用这样的悲剧,它实现了 UI 设计指南规则。每个用户都熟悉的规则。您需要使用自己的按钮控件来创建自己的悲剧。
  • 完全同意 - 该问题正在通过按钮图像更改来解决。

标签: c# winforms button colors backcolor


【解决方案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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-14
          • 1970-01-01
          • 2021-05-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多