代码之家  ›  专栏  ›  技术社区  ›  Brann

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

  •  5
  • Brann  · 技术社区  · 16 年前

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

    我在某个地方上了一堂这样的静态课:

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

    我可以很容易地在我的代码中使用这些颜色,但从设计师那里是不可能做到的,这会引发以下错误:

    我的颜色。暗绿色不是有效的 Int32的值。

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

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

    有什么想法吗?


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

    5 回复  |  直到 6 年前
        1
  •  2
  •   Jeff Yates    16 年前

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

    你也可以通过做类似的事情来获得一些成功 TypeConverter 还有 TypeConverterAttribute .

        2
  •  2
  •   MusiGenesis    16 年前

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

        3
  •  1
  •   NascarEd    16 年前

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

    我做过一些项目,有一个类似于你的计划,各种各样的问题都出现了。一个按钮在设计器中被设置为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;
        }
    

    这样,如果你想把所有的按钮都从暗绿色改为橙色,只需一行即可。

        4
  •  1
  •   Yalin Meric    15 年前

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

    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控件的相关属性。然后在申请表中拖放这些标签。当你需要改变他们的颜色时,只需在上面的课堂上做,然后重新构建应用程序。这种方法将创建一个静态彩色标签,您不能从设计器或代码更改其颜色。

        5
  •  0
  •   sdolphin    16 年前

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

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