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

5

我正在构建一个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的“替换全部”功能进行更改。虽然这不是一个好的解决方案,但我还没有找到更好的想法。
有什么好的建议吗?
注意:我知道关于这个问题,但它与我的略有不同,因为我不想改变“KnownColors”。
5个回答

2
要获得设计师对额外颜色定义的支持,您可能需要创建自己的编辑器来扩展或替换Color编辑器。一旦您定义了这些内容,您就需要告诉设计师哪些属性应该使用您的编辑器,通过将Editor属性应用于受影响的属性。
您还可以通过使用TypeConverterTypeConverterAttribute来类似地实现某些成功。

@Jeff:由于我想要更新默认的winforms控件(按钮,标签等)的颜色,所以我不能真正地将Editor属性应用于它们的ForeColor/BackColor属性,除非我从所有这些控件继承,这听起来有点过度杀伤力了...或者我错过了什么? - Brann
@Brann:你已经通过实现你的表单来继承了。你需要将它应用于自己表单中的重写。 - Jeff Yates
当然,表单内的控件要么需要设置为Color.Empty以从其父控件继承,要么您也需要覆盖这些控件。恐怕我不认为有其他替代方法来获得设计师支持。 - Jeff Yates
@Jeff:我通过实现我的表单来继承,但是我不实现我拖动到其上的控件。此外,我不希望所有控件具有相同的背景颜色和/或前景颜色(即我想在同一表单上创建一个深绿色按钮和一个橙色按钮),这意味着我不能从父控件(即表单)继承颜色(不是面向对象的意义)。 - Brann
@Brann:是的,正如我所说的,我认为您需要派生每个控件类型,以添加对额外颜色定义的设计师支持。 - Jeff Yates

2

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


1
你可以通过提供自己的 TypeConverter 来覆盖此行为,但你需要覆盖控件以将其添加到属性中才能使其工作。 - Jeff Yates
@Jeff:我相信你,就像StackOverflow的典型情况一样,当我说“你不能这样做”时,我会得到投票,而当你建议如何做时,你没有得到投票(直到我的投票)。 :) - MusiGenesis

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,只需要一行代码就可以实现。

1

如果您正在尝试使用主题方法,即使用具有固定背景颜色和前景颜色属性的标签创建组件并更改其后台代码,请按以下方式操作:

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

正如您所看到的,您只需要覆盖标签控件的相关属性即可。然后将这些标签拖放到应用程序表单中。当您需要更改它们的颜色时,只需在上述类中进行更改并重新构建应用程序即可。这种方法将创建一个静态颜色标签,您无法从设计师或代码中更改其颜色。


0

这应该会给你想要的结果。可能有过多的括号可以删除。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接