Список веб-цветов в приложении C # - PullRequest
7 голосов
/ 23 февраля 2011

Привет всем,

Если, например, я установил BackColor для панели в Winform, используя Visual Studio, я могу выбрать цвет из 3 списков:

Custom, Web, System

Возможно ли получить только веб-цвета в моем приложении C # code? Они являются частью KnownColor, но до сих пор я мог только найти, как исключить System Control из моего списка.

Я хотел бы использовать веб-цвета, потому что они хорошо отсортированы, и я хотел бы вставить их в самореализованный комбинированный список.

Спасибо

Ответы [ 3 ]

8 голосов
/ 23 февраля 2011
var webColors = 
  Enum.GetValues(typeof(KnownColor))
    .Cast<KnownColor>()
    .Where (k => k >= KnownColor.Transparent && k < KnownColor.ButtonFace) //Exclude system colors
    .Select(k => Color.FromKnownColor(k));

РЕДАКТИРОВАТЬ:

Чтобы заказать цвета добавить:

.OrderBy(c => c.GetHue())
.ThenBy(c => c.GetSaturation())
.ThenBy(c => c.GetBrightness());
8 голосов
/ 23 февраля 2011

Color struct содержит все веб-цвета в качестве констант (системные цвета определены как константы в SystemColors классе)

Чтобы получить список этих цветов, просто выполните:

var webColors = GetConstants(typeof(Color));
var sysColors = GetConstants(typeof(SystemColors));

с GetConstants, определенным следующим образом:

static List<Color> GetConstants(Type enumType)
{
    MethodAttributes attributes = MethodAttributes.Static | MethodAttributes.Public;
    PropertyInfo[] properties = enumType.GetProperties();
    List<Color> list = new List<Color>();
    for (int i = 0; i < properties.Length; i++)
    {
        PropertyInfo info = properties[i];
        if (info.PropertyType == typeof(Color))
        {
            MethodInfo getMethod = info.GetGetMethod();
            if ((getMethod != null) && ((getMethod.Attributes & attributes) == attributes))
            {
                object[] index = null;
                list.Add((Color)info.GetValue(null, index));
            }
        }
    }
    return list;
}

EDIT:

Чтобы отсортировать цвета точно так же, как в VS, сделайте:

var webColors = GetConstants(typeof(Color));
var sysColors = GetConstants(typeof(SystemColors));

webColors.Sort(new StandardColorComparer());
sysColors.Sort(new SystemColorComparer());

с StandardColorComparer и SystemColorComparer, определенными следующим образом:

class StandardColorComparer : IComparer<Color>
{
    // Methods
    public int Compare(Color color, Color color2)
    {
        if (color.A < color2.A)
        {
            return -1;
        }
        if (color.A > color2.A)
        {
            return 1;
        }
        if (color.GetHue() < color2.GetHue())
        {
            return -1;
        }
        if (color.GetHue() > color2.GetHue())
        {
            return 1;
        }
        if (color.GetSaturation() < color2.GetSaturation())
        {
            return -1;
        }
        if (color.GetSaturation() > color2.GetSaturation())
        {
            return 1;
        }
        if (color.GetBrightness() < color2.GetBrightness())
        {
            return -1;
        }
        if (color.GetBrightness() > color2.GetBrightness())
        {
            return 1;
        }
        return 0;
    }
}

class SystemColorComparer : IComparer<Color>
{
    // Methods
    public int Compare(Color color, Color color2)
    {
        return string.Compare(color.Name, color2.Name, false, CultureInfo.InvariantCulture);
    }
}

N.B. :

Этот код был взят из System.Drawing.Design.ColorEditor через отражатель.

0 голосов
/ 23 февраля 2011

Если вам нужно отсортировать его по основному цвету, вы можете использовать его в качестве отправной точки:

var colors = Enum.GetValues(typeof(KnownColor))
                 .Cast<KnownColor>()
                 .Select(kc => Color.FromKnownColor(kc))
                 .OrderBy(c => c.GetHue())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...