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

时间:2009-10-01 13:51:04

标签: .net winforms colors skinning

我正在构建一个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的替换所有功能进行更改。这不是一个很好的解决方案,但到目前为止我还没有找到更好的想法。

有什么想法吗?


注意:我知道this question,这与我的略有不同,因为我不打算更改“KnownColors”。

5 个答案:

答案 0 :(得分:2)

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

通过使用TypeConverterTypeConverterAttribute执行类似的操作,您也可以取得一些成功。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

你最好的选择可能是不尝试在设计师中做任何事情。只需在设计时将所有表单保留为默认颜色即可。

我一直在进行类似于你的计划的项目,各种各样的问题随之而来。设计器中的按钮被设置为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;
    }

这样,如果您想将所有按钮从DarkGreen更改为Orange,则只需更改一行。

答案 3 :(得分:1)

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

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;
            }
        }
    }
}

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

答案 4 :(得分:0)

这应该可以为您提供所需的结果。您可以删除过多的括号。

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