.net 我应该如何在WinForm应用程序中实现应用程序范围的颜色代码?

.net 我应该如何在WinForm应用程序中实现应用程序范围的颜色代码?,.net,winforms,colors,skinning,.net,Winforms,Colors,Skinning,我正在构建一个WinForms应用程序,并且在大多数控件上使用特定的颜色。我有时从WinForms设计器中执行此操作,有时直接在代码中执行此操作 我在某个地方得到了一个静态类,看起来是这样的: public static class MyColors { public static Color DarkGreen = Color.FromArgb(0, 70, 62); ... public static Color Orange = C

我正在构建一个WinForms应用程序,并且在大多数控件上使用特定的颜色。我有时从WinForms设计器中执行此操作,有时直接在代码中执行此操作

我在某个地方得到了一个静态类,看起来是这样的:

 public static class MyColors
    {
        public static Color DarkGreen = Color.FromArgb(0, 70, 62);
        ...
        public static Color Orange = Color.FromArgb(239, 132, 16);

    }
我可以很容易地在代码中使用这些颜色,但从设计器中无法做到这一点,这会引发以下错误:

MyColors.DarkGreen不是有效的 Int32的值

(我尝试存储这些颜色的Int32表示,但失败了,出现了相同的错误)

我现在使用的解决方案是在设计器中使用rgb颜色代码,在代码中使用MyColors类值,并使用Visual Studio的“全部替换”功能进行更改。这不是一个好的解决方案,但到目前为止我还没有找到更好的办法

有什么想法吗



注意:我知道,这与我的略有不同,因为我不打算更改“Known颜色”。

要获得设计师对附加颜色定义的支持,您可能需要创建自己的编辑器来扩展或替换编辑器。一旦定义了这些属性,就需要通过将属性应用于受影响的属性来告诉设计器哪些属性应该使用编辑器


您也可以通过使用和来执行类似的操作来获得一些成功。

我认为这是不可能的,因为您需要更改属性窗口本身的行为。键入“255、128、64”之所以有效,是因为“属性”窗口包含的代码试图将键入的任何内容转换为系统颜色、命名的“web”颜色或RGB指定的颜色,并显示“blah blah blah blah不是Int32的有效值”。对于无法转换的任何文本(如“MyColors.DarkGreen”)的消息.

你最好的选择是不要尝试在设计师身上做任何事情。只需在设计时将所有窗体保留为默认颜色即可

我参与的项目有一个类似于你的计划,各种各样的问题都出现了。在设计器中将按钮设置为RGB值;同一窗体上的另一个按钮在代码中设置了颜色(来自静态类),两种颜色略有不同。随着时间的推移,这些问题将逐渐出现

如果要更改颜色,必须更改静态类并选中表单的所有。细微的差别不会很明显

如果您在代码中设置了所有颜色,如果您丢失了一个控件,它将立即变得明显。如果你决定改变一种颜色,你只需要在一个地方改变它

我们做的另一个调整是将成员添加到静态类中,该类的名称中提到了使用方法

例如:

 public static class MyColors
    {
        public static Color DarkGreen = Color.FromArgb(0, 70, 62);
        ...
        public static Color Orange = Color.FromArgb(239, 132, 16);

        public static Color ButtonBackColor = DarkGreen;
    }

这样,如果您想将所有按钮从暗绿色更改为橙色,则只需更改一行即可。

这将为您提供所需的结果。可能有过多的括号可以删除

public static Color DarkGreen = Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(70)))), ((int)(((byte)(62)))));

如果您尝试采用主题方法,即具有固定背景色和前景色属性的标签将创建一个组件并更改其代码,如下所示:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace YourNameSpace
{
    public partial class NameOfStaticColoredLabel : Label
    {
        public NameOfStaticColoredLabel()
        {
            InitializeComponent();
        }

        public NameOfStaticColoredLabel(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
        }

        public override Color ForeColor
        {
            get
            {
                return Color.Black;
            }
            set
            {
                base.ForeColor = Color.Black;
            }
        }

        public override Color BackColor
        {
            get
            {
                return Color.Aquamarine;
            }
            set
            {
                base.BackColor = Color.Aquamarine;
            }
        }
    }
}

正如您所看到的,您所必须做的就是重写label控件的相关属性。然后在申请表中拖放这些标签。当你们需要改变他们的颜色时,只需在上面的类中进行,然后重新构建应用程序。这种方法将创建一个静态彩色标签,您无法从设计器或代码中更改其颜色。

@Jeff:因为我想更新默认winforms控件(按钮、标签等)的颜色,所以我无法将编辑器属性应用于它们的前景色/后景色属性,除非我从所有这些控件继承,这听起来有点过分了。。。还是我错过了什么?@Brann:你已经通过实现你的表单继承了。您必须将其应用于自己表单中的重写。当然,表单中的控件需要设置为Color.Empty以从其父控件继承,或者您也需要重写这些控件。恐怕我不认为有其他方法可以获得设计器支持。@杰夫:我通过实现表单继承,但我没有实现我在表单上拖动的控件。另外,我不希望我的所有控件都有相同的背景色和/或前景色(即我希望能够在同一窗体上创建一个深绿色按钮和一个橙色按钮),这意味着我不能从父控件(即窗体)继承颜色@Brann:是的,正如我所说,我认为您必须派生每个控件类型,才能为其他颜色定义添加设计器支持。您可以通过提供自己的TypeConverter来覆盖此行为,但您需要覆盖这些控件,才能将其添加到属性中,使其正常工作。@Jeff:我相信您,就像StackOverflow的典型情况一样,我有理由这样说“你不能这么做”,而你却没有得到建议你如何做到这一点的选票(直到我的选票)