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”。

4

5 回答 5

2

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

于 2009-10-01T14:24:36.637 回答
2

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

您也可以通过使用 aTypeConverterTypeConverterAttribute.

于 2009-10-01T13:53:36.543 回答
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,只需更改一行。

于 2009-10-01T14:46:37.527 回答
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;
            }
        }
    }
}

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

于 2010-11-12T09:58:33.253 回答
0

这应该会给你你正在寻找的结果。您可以删除的括号可能过多。

public static Color DarkGreen = Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(70)))), ((int)(((byte)(62)))));
于 2009-10-02T15:44:27.607 回答