Visual Studio C#Windows窗体。。。改变按钮颜色?

Visual Studio C#Windows窗体。。。改变按钮颜色?,c#,winforms,C#,Winforms,我有一个表格(见截图): 如您所见,它是一个非常基本的表单,带有一个保存按钮。我已经对它进行了编程,这样,如果任何文本字段发生更改,“保存”按钮就会改变颜色,这样很明显,我没有单击保存,而且不要忘记。不幸的是,仅仅把按钮的背景颜色改成红色是不够的,因为它丑陋得像罪恶 我该怎么做才能把按钮的颜色改成红色,但不要那么难看。正如你所看到的,“背景色”并没有改变整个按钮,只是改变了内部部分。边框仍然是老式的透明灰色。关于如何用c#创建漂亮的按钮,网上有很多教程。例如,这一个允许您创建类似Vista的

我有一个表格(见截图):

如您所见,它是一个非常基本的表单,带有一个保存按钮。我已经对它进行了编程,这样,如果任何文本字段发生更改,“保存”按钮就会改变颜色,这样很明显,我没有单击保存,而且不要忘记。不幸的是,仅仅把按钮的背景颜色改成红色是不够的,因为它丑陋得像罪恶


我该怎么做才能把按钮的颜色改成红色,但不要那么难看。正如你所看到的,“背景色”并没有改变整个按钮,只是改变了内部部分。边框仍然是老式的透明灰色。

关于如何用c#创建漂亮的按钮,网上有很多教程。例如,这一个允许您创建类似Vista的按钮。请看这里:

有关基本颜色,请访问此SO问题:


这在WinForms中不起作用,但您可能希望切换到WPF。 它更方便,因为您可以配置所有内容。(甚至是进度条的颜色)

编辑:OP不必完全重写他的应用程序。 他只需要重做它的布局,代码可以被C&P提交给新的WPF项目,仅供参考


Edit²:您甚至不需要使用代码来更改WPF按钮的颜色,只需在XAML文件中定义一个不透明度为30%的红色覆盖即可。这真的很简单。

另一个解决方案是在按钮上添加一个(例如感叹号)来通知用户更改尚未保存。

稍微使用一点
LinearGradientBrush
可以大大减轻纯红色按钮的粗糙度

button1.ForeColor = Color.White;

Bitmap bmp = new Bitmap(button1.Width, button1.Height);
using (Graphics g = Graphics.FromImage(bmp)) {
  Rectangle r = new Rectangle(0, 0, bmp.Width, bmp.Height);
  using (LinearGradientBrush br = new LinearGradientBrush(
                                      r,
                                      Color.Red,
                                      Color.DarkRed,
                                      LinearGradientMode.Vertical)) {
      g.FillRectangle(br, r);
    }
  }
然后,您可以将图像分配给按钮的
BackgroundImage
属性:

  button1.BackgroundImage = bmp;
结果:


注意:指定背景图像将丢失按钮的鼠标悬停颜色。

您只需使用按钮的属性之一“FlatStyle”。默认情况下,它是标准的。但是,如果您将其切换为“弹出”,您的背景色将扩展到按钮区域。您可以比较以下各项:


也许前景色(而不是背景色)就足够了?最简单的方法是将应用程序转换为WPF,这样您可以拥有更大的控制权。由于这是一个很好的工作量,如果更改值BackColor不能满足您的需要,您将不得不继承按钮控件,并更改按钮的绘制方式。我个人会一直禁用保存按钮,直到发生更改。在更改的详细信息上启用,然后在单击时再次禁用。另一个选择是:)@Ramhound我认为给OP最好的建议不是“完全重写你的应用程序”@ken2k-他不必“重写”整个应用程序。他所要做的就是使用窗口类而不是Win32类。如果你有更好的解决方案,那就提供一个。我想那些反对票来自那些从未听说过WPF的人。不,WPF真的是一项伟大的技术。但由于OP正在使用Winforms,“重写所有应用程序,移动到WPF”的答案是一个非常糟糕的答案。有关我的答案,请参阅答案上的编辑。)编辑:@noah1989是的,因为它向OP展示了旧WinForms平台的局限性和WPF的优势。我一个月前才开始用WPF编程,现在已经有了回报。@ken2k-这是对所问问题的一个完全正确的答案。作者想知道如何使按钮改变颜色,而不是看起来“丑陋”,这只留给他两个选择。使用WPF可以对控件进行更大的控制,或者编写自己的按钮控件。感谢上帝,没有人再尝试支持它了,对吧。。。对吗?另一个解决方案是自动保存。你也可以使用Ribbon或ToolStrip。我想知道你是否可以在背景图像上使用透明度使其与原始按钮混合。然后我如何删除背景图像?@JasonAxelrod只是一个简单的
button1.BackgroundImage=null可以。@LarsTech我可以从中删除边框吗button@madan您可以尝试使用按钮的绘制事件。您可能需要重新实现鼠标悬停和鼠标向下的外观。教程已被删除:
“很抱歉,您试图查看的文章已于2013年5月18日被删除。”
欢迎阅读!人们不鼓励重新提出老问题(2012!),尤其是那些已经接受答案的问题。